Android - 从连接联系照片

时间:2017-03-18 17:28:20

标签: android android-contacts

如果联系人有连接,例如Whatsapp或Skype,并且该联系人没有照片,则会显示Whatsapp或Skype照片。

如果联系人照片没有照片,如何获取连接照片?

public byte[] getPhoto(String contactId) {
            Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(contactId));
            Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
        try
        {
            Cursor c = getContentResolver().query(photoUri,
                    new String[] {ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
            try {
                if (c.moveToFirst()) {
                    final byte[] image = c.getBlob(0);
                    final Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    return stream.toByteArray();
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                c.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new byte[0]; 
    }

解决

此方法可正常工作。问题出在该计划的另一部分。很抱歉给您带来不便,谢谢大家。

1 个答案:

答案 0 :(得分:1)

首先,请注意Whatsapp应用中没有显示Contacts照片,它只会显示在Whatsapp应用中,因为它是Whatsapp本地存储的专有照片1}}应用,第三方应用无法访问。 我不确定Skype,但如果您确实在Contacts应用中看到了一张照片,则应该可以通过API访问它。

您发布的代码访问了该联系人的缩略图大小的照片,该联系人可能只有高分辨率照片而且没有缩略图。

使用ContactsContract.DisplayPhoto尝试此代码:

 public InputStream openDisplayPhoto(long photoFileId) {
     Uri displayPhotoUri = ContentUris.withAppendedId(DisplayPhoto.CONTENT_URI, photoKey);
     try {
         AssetFileDescriptor fd = getContentResolver().openAssetFileDescriptor(
             displayPhotoUri, "r");
         return fd.createInputStream();
     } catch (IOException e) {
         return null;
     }
 }

此外,此代码会显示为联系人存储的所有照片及其RawContact ID来源:

String[] projection = new String[] { CommonDataKinds.Photo.PHOTO_FILE_ID, CommonDataKinds.Photo.PHOTO, CommonDataKinds.Photo.RAW_CONTACT_ID };
String selection = Data.MIMETYPE + "='" + CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "' AND " + Data.CONTACT_ID + "=" + contactId;
Cursor c = resolver.query(Data.CONTENT_URI, projection, selection, null, null);
while (c != null && c.moveToNext()) {
   Long photoId = c.getLong(0);
   boolean hasPhoto = c.isNull(1);
   Long rawContactId = c.getLong(2);
   Log.d(TAG, "found photo: " + photoId + ", " + rawContactId + ", " + hasPhoto);
}