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而不是原始数据.我的问题:
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没有照片,那么这将添加一个.
遗憾的是,无法使用openAssetFileDescriptor
a PHOTO_FILE_ID
,因此您无法使用此方法覆盖由其ID标识的特定照片.然而,在现实生活中,大多数联系人可能最多只有一张照片,所以这不是一个真正的限制.
这将Photo.PHOTO
使用大照片的缩略图自动更新列并指定一个PHOTO_FILE_ID
.
归档时间: |
|
查看次数: |
1678 次 |
最近记录: |