【问题标题】:Android - Contact photo from connectionAndroid - 来自连接的联系人照片
【发布时间】:2017-03-22 04:06:08
【问题描述】:

当联系人有连接时,例如 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]; 
    }

已解决

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

【问题讨论】:

  • the Whatsapp or Skype photo appears 它出现在哪里?在联系人应用程序中?如果是这样,那么联系人确实有照片...
  • 是的,在联系人应用程序中。联系人没有照片,但出现连接时,会显示连接的照片,例如 Skype 用户照片。通过API的代码,我恢复了联系人照片,但是API没有恢复只有连接照片时出现的照片。
  • 联系人应用程序中出现的任何照片都应该可以通过 API 访问,发布您正在使用的代码以获取联系人照片

标签: android android-contacts


【解决方案1】:

首先,请注意Whatsapp 的照片不会出现在您的Contacts 应用程序中,它只会出现在Whatsapp 应用程序中,这是因为它是存储在Whatsapp 应用程序本地的专有照片并且无法访问到 3rd 方应用程序。 我不确定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);
}

【讨论】:

  • 你说得对,whatsapp 不会出现,只会出现 Skype 照片。
  • 数据是什么类型?查询给了我 android.database.sqlite.SQLiteException: no such column: mimetype
  • 并且 c.getLong(CommandDataKinds.Photo.PHOTO_FILE_ID) 无法编译。它将是 c.getLong(c.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID))?
  • 关于getLong,我已经编辑了代码以将投影添加到查询中,关于Data,它应该是android.provider.ContactsContract.Data
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多