在 RawContacts 中找不到 Facebook 联系人

Posted

技术标签:

【中文标题】在 RawContacts 中找不到 Facebook 联系人【英文标题】:Cannot find Facebook contacts in RawContacts 【发布时间】:2011-08-27 15:41:27 【问题描述】:

我正在尝试构建一个联系人管理应用程序。在我的手机上,我有来自几个帐户的联系人,包括 Facebook 和 HTC Facebook。由于某种原因,我无法从ContactsContractRawContacts 表中检索这些联系人:

managedQuery(ContactsContract.RawContacts.CONTENT_URI, new String[] 
    ContactsContract.RawContacts._ID,
    ContactsContract.RawContacts.CONTACT_ID,
    ContactsContract.RawContacts.ACCOUNT_NAME,
    ContactsContract.RawContacts.ACCOUNT_TYPE,
, ContactsContract.RawContacts.ACCOUNT_TYPE + " = 'com.facebook.auth.login'", null, null)

此查询不返回任何结果。如果我用com.htc.socialnetwork.facebook 替换帐户类型,我仍然没有得到任何结果。我的手机上有很多 Facebook 联系人;如何找回它们?

【问题讨论】:

【参考方案1】:

我想我在这里找到了答案:How to get a contact's facebook id or url from native contacts / content resolver?

似乎对 Facebook 联系人的访问受到限制。

【讨论】:

【参考方案2】:

是的,Facebook 联系人是安全的,但可以通过一些偷偷摸摸的 SQLite 注入来劫持。不——我不会在这个页面上发帖,但你有什么理由不只是使用 Facebook 身份验证并以这种方式获取联系人吗?无论如何,Facebook 联系人实际上并没有任何有用的东西,而且它更安全,更有可能在所有情况下都能正常工作

【讨论】:

【参考方案3】:

绝对没有办法以标准方式做到这一点。因此,我们必须使用 SQLi 注入(正如 roger 评论的那样)才能破解联系人数据库并获取 Facebook 头像。以下代码适用于大多数在 android 2.2 或更高版本上使用 Motoblur 的摩托罗拉:

public static Bitmap loadFacebookAvatar(Context context, long personId) 
    String[] rawProjection = ContactsContract.RawContacts._ID;
    String contactIdAssertion = ContactsContract.RawContacts.CONTACT_ID + " = " + personId;
    String rawWhere = new StringBuilder()
            .append(contactIdAssertion).append(") UNION ALL SELECT ")
            .append(ContactsContract.RawContacts._ID).append(" FROM view_raw_contacts WHERE (")
            .append(contactIdAssertion).toString();
    Cursor query = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,
            rawProjection,
            rawWhere, null, null);
    if (query != null && query.moveToFirst()) 
        do 
            long id = query.getLong(query.getColumnIndex(ContactsContract.RawContacts._ID));
            String[] projection = ContactsContract.CommonDataKinds.Photo.PHOTO;
            Uri uri = ContactsContract.Data.CONTENT_URI;

            String mimeTypeAssertion = ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
            String photoAssertion = ContactsContract.CommonDataKinds.Photo.PHOTO + " IS NOT NULL";
            String rawContactIdAssertion = ContactsContract.CommonDataKinds.Photo.RAW_CONTACT_ID + " = " + id;

            String where = new StringBuilder().append(mimeTypeAssertion).append(" AND ")
                    .append(photoAssertion).append(" AND ").append(rawContactIdAssertion)
                    .append(") UNION ALL SELECT ").append(ContactsContract.CommonDataKinds.Photo.PHOTO)
                    .append(" FROM view_data WHERE (").append(photoAssertion).append(" AND ")
                    .append(rawContactIdAssertion).toString();

            Cursor photoQuery = context.getContentResolver().query(uri, projection, where, null, null);
            if (photoQuery != null && photoQuery.moveToFirst()) 
                do 
                    byte[] photoData = photoQuery.getBlob(photoQuery.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO));
                    if (photoData != null) 
                        return BitmapFactory.decodeByteArray(photoData, 0, photoData.length, null);
                    
                 while (photoQuery.moveToNext());
            
         while (query.moveToNext());
    
    return null;

对于其他手机,您必须获取联系人数据库并对其进行分析,以确定如何应用 SQL 注入,这需要有根手机。

【讨论】:

我从哪里得到 personId ?

以上是关于在 RawContacts 中找不到 Facebook 联系人的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何在一个查询中列出属于特定 RawContacts 帐户的所有数据行

android中RawContacts.CONTENT_URI和ContactsContract.Contacts.CONTENT_URI的区别

通过从 RawContacts 过滤 account_type 列来显示联系人

如何在以编程方式将 newInsert 插入地址簿后获取最后插入的 RawContacts ID?

Laravel 4在TestCase中找不到测试

为啥在集合中找不到 Mysql 存储过程参数?