WhatsApp のプロフィール写真を取得したいのですが、名前と連絡先番号しか取得できません。質問する

WhatsApp のプロフィール写真を取得したいのですが、名前と連絡先番号しか取得できません。質問する

WhatsApp のプロフィール写真と番号を取得したいのですが、contentResolver を使用すると、次のスニペット コードを使用して名前と番号のみを取得します。

private void showContactWhatsApp(){

    ContentResolver cr = getContentResolver();

    Cursor contactCursor = cr.query(
            ContactsContract.RawContacts.CONTENT_URI,
            new String[]{ContactsContract.RawContacts._ID,
                    ContactsContract.RawContacts.CONTACT_ID},
            ContactsContract.RawContacts.ACCOUNT_TYPE + "= ?",
            new String[]{"com.whatsapp"},
            null);


    ArrayList<String> myWhatsappContacts = new ArrayList<>();

    if (contactCursor != null) {
        if (contactCursor.getCount() > 0) {
            if (contactCursor.moveToFirst()) {
                do {
                    //whatsappContactId for get Number,Name,Id ect... from  ContactsContract.CommonDataKinds.Phone
                    String whatsappContactId = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));

                    if (whatsappContactId != null) {
                        //Get Data from ContactsContract.CommonDataKinds.Phone of Specific CONTACT_ID
                        Cursor whatsAppContactCursor = cr.query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                                        ContactsContract.CommonDataKinds.Phone.NUMBER,
                                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                                new String[]{whatsappContactId}, null);

                        if (whatsAppContactCursor != null) {
                            whatsAppContactCursor.moveToFirst();
                            String id = whatsAppContactCursor.getString(whatsAppContactCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
                            String name = whatsAppContactCursor.getString(whatsAppContactCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                            String number = whatsAppContactCursor.getString(whatsAppContactCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                            whatsAppContactCursor.close();

                            //Add Number to ArrayList
                            myWhatsappContacts.add(number);

                            Log.e(TAG, " WhatsApp contact id  :  " + id);
                            Log.e(TAG, " WhatsApp contact name :  " + name);
                            Log.e(TAG, " WhatsApp contact number :  " + number);
                        }
                    }
                } while (contactCursor.moveToNext());
                contactCursor.close();
            }
        }
    }

    Log.e(TAG, " WhatsApp contact size :  " + myWhatsappContacts.size());
}

SyncMe アプリのように WhatsApp プロフィール写真を取得したいです。

名前、番号、サムネイルを含む WhatsApp の連絡先リストが取得されるのを待ちます。

ベストアンサー1

RawContactまず、 aと aの違いについて再度説明したいと思いますContact。後者は、前者 (アカウントを表す) の集合 (人物を表す) です。

画像の用途によっては、集約された連絡先を取得し、そこで選択されたプロフィール画像を使用する方が良い場合があります。これは、写真契約

Uri photoUri;
Cursor photoCur = cr.query(
    ContactsContract.Data.CONTENT_URI, null,
    ContactsContract.Data.CONTACT_ID + "=" + aggregateContactId + " AND " + 
    ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", 
    null, null
);
if (photoCur != null && photoCur.moveToFirst()) {
    Uri photoId = ContentUris.withAppendedId(Contacts.CONTENT_URI, aggregateContactId);
    photoUri = Uri.withAppendedPath(person, Contacts.Photo.CONTENT_DIRECTORY);
}

WhatsApp の写真を特に使用する場合は、まず写真がデバイスにキャッシュされていることを確認します (テスト中に誤検知を回避するため - WhatsApp で連絡先のフル画像を開くと、キャッシュされていることを確認できます)。次に、画像を個別に検索する必要があります (API 14 から)。

Uri photoId = ContentUris.withAppendedId(RawContacts.CONTENT_URI, whatsappContactId);
Uri photoUri = Uri.withAppendedPath(photoId, RawContacts.DisplayPhoto.CONTENT_DIRECTORY);

おすすめ記事