在RawContacts中找不到Facebook联系人

Fix*_*int 9 android facebook contacts

我正在尝试构建一个联系人管理应用程序.在我的手机上,我有来自Facebook和HTC Facebook等几个账户的联系人.出于某种原因,我无法从以下RawContacts表中检索这些联系人ContactsContract:

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)
Run Code Online (Sandbox Code Playgroud)

此查询不返回任何结果.如果我重新使用帐户类型com.htc.socialnetwork.facebook,我仍然没有结果.我的手机上有很多Facebook联系人; 如何检索它们?

Fix*_*int 6

我想我在这里找到了答案:如何从本地联系人/内容解析器获取联系人的Facebook ID或URL?

似乎访问Facebook联系人受到限制.


rog*_*r l 5

是的,Facebook联系人是安全的,但可以通过一些偷偷摸摸的SQLite注入被劫持.不 - 我不打算在这个页面上发帖,但有没有理由你不只是使用Facebook身份验证并获得联系方式?Facebook联系人无论如何都没有任何有用的东西,它更安全,更有可能全部工作


Cri*_*ian 5

绝对没有办法以标准的方式做到这一点.因此,我们必须使用SQLi注入(作为roger评论),以便能够破解联系人数据库并获取Facebook头像.以下代码适用于Android 2.2或更高版本上使用Motoblur的大多数Motorolas:

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;
}
Run Code Online (Sandbox Code Playgroud)

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