2017-02-09 33 views
19

Chcę uzyskać zdjęcie i numer profilu WhatsApp, ale za pomocą contentResolver otrzymam tylko nazwę i numer za pomocą poniższego kodu fragmentu.Chcę uzyskać profil whatsApp, ale tylko pobierając nazwę i numer kontaktowy?

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()); 
} 

Chcę uzyskać zdjęcie profilowe WhatsApp podobne do aplikacji SyncMe.

Czekam, aby uzyskać listę kontaktów WhatsApp z nazwą, numerem i miniaturą.

Odpowiedz

4

Po pierwsze, chcę tylko powtórzyć różnicę między RawContact a Contact. Ta ostatnia jest agregacją (reprezentującą osobę) pierwszego (reprezentującą konto).

W zależności od tego, jaki użytek masz do zdjęcia, może być lepiej pobrać łączny kontakt i użyć wybranego tam obrazu profilu, który można uzyskać za pomocą Photo contract.

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); 
} 

Jeśli masz użyć specjalnie do fotografii WhatsApp, najpierw upewnij się, że zdjęcia są buforowane na urządzeniu (tylko w celu uniknięcia fałszywych flagi podczas testowania - otworzyć kontakty pełny obraz w WhatsApp i możesz być pewien, że w pamięci podręcznej) następnie musisz wykonać osobne wyszukiwanie obrazu (z API 14):

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

Czy to nie zadziałało dla PO? –