通过Android中的PHOTO_FILE_ID将联系人的图片更改为大型照片

Guy*_*Guy 10 java android android-contacts

这似乎适用于小图像:

ContentValues values = new ContentValues();

values.put(ContactsContract.Data.RAW_CONTACT_ID, id);
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, photo);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
if (photoRow >= 0) {
    context.getContentResolver().update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null);
} else {
    context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
}
Run Code Online (Sandbox Code Playgroud)

文档我意识到,对于大图像我需要设置PHOTO_FILE_ID,所以我可以替换:

ContactsContract.CommonDataKinds.Photo.PHOTO
Run Code Online (Sandbox Code Playgroud)

有:

ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID
Run Code Online (Sandbox Code Playgroud)

但是,我需要提供PHOTO_FILE_ID而不是原始数据.我的问题:

  1. 如何保存照片(byte [])并获取PHOTO_FILE_ID?
  2. 如果已有照片可用(照片不是PHOTO_FILE_ID).我是否需要删除它才能看到大图像,或者大图像是否优先,如果不是,我该如何删除它?

Mar*_*ten 20

你自己的答案会有效,但效率不高,因为照片需要编码成SQL查询并通过Android IPC传输.这也使它成为Android的IPC大小限制为1MB(即如果你的照片太大,内容提供商操作将失败).

设置(创建或覆盖)RawContact(主要)照片的最有效方法是使用openAssetFileDescriptor和如下所示的 ContactsContract.RawContacts.DisplayPhoto URI(从Android文档复制的示例):

public void writeDisplayPhoto(long rawContactId, byte[] photo) {
    Uri rawContactPhotoUri = Uri.withAppendedPath(
            ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
            RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
    try {
        AssetFileDescriptor fd =
            getContentResolver().openAssetFileDescriptor(rawContactPhotoUri, "rw");
        OutputStream os = fd.createOutputStream();
        os.write(photo);
        os.close();
        fd.close();
    } catch (IOException e) {
        // Handle error cases.
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的唯一缺点是它总是创建/替换主要照片RawContact.如果RawContact没有照片,那么这将添加一个.

遗憾的是,无法使用openAssetFileDescriptora PHOTO_FILE_ID,因此您无法使用此方法覆盖由其ID标识的特定照片.然而,在现实生活中,大多数联系人可能最多只有一张照片,所以这不是一个真正的限制.

这将Photo.PHOTO使用大照片的缩略图自动更新列并指定一个PHOTO_FILE_ID.