Не удается найти контакты Facebook в RawContacts - PullRequest
9 голосов
/ 18 мая 2011

Я пытаюсь создать приложение для управления контактами.На моем телефоне есть контакты из нескольких учетных записей, включая 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)

Этот запрос не возвращает результатов.Если я изменю тип учетной записи на com.htc.socialnetwork.facebook, я все равно не получу никаких результатов.На моем телефоне много контактов из Facebook;как их получить?

Ответы [ 3 ]

6 голосов
/ 21 мая 2011

Я думаю, что нашел ответ здесь: Как получить идентификатор контакта Facebook или URL-адрес от нативных контактов / преобразователя содержимого?

Кажется, что доступ к контактам Facebook ограничен.

5 голосов
/ 17 сентября 2011

Определенно нет способа сделать это стандартным способом. Таким образом, мы должны использовать SQLi-инъекцию (как прокомментировал Роджер), чтобы иметь возможность взломать базу контактов и получить аватары Facebook. Следующий код работает на большинстве Motorolas, которые используют Motoblur, на Android 2.2 или выше:

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-инъекцию, для которой требуется телефон с рутом.

5 голосов
/ 28 мая 2011

Да, контакты Facebook защищены, но могут быть похищены с помощью небольшого хитрого SQLite Injection.НЕТ - Я не собираюсь публиковать здесь на этой странице, но есть ли причина, по которой вы не просто используете аутентификацию Facebook и получаете контакты таким образом?В любом случае, контакты Facebook не содержат в себе ничего полезного, просто они более безопасны и с большей вероятностью сработают ВСЕХ

...