当前位置: 首页 > 面试题库 >

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

鄢英毅
2023-03-14
问题内容

这似乎适用于小图像:

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

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

ContactsContract.CommonDataKinds.Photo.PHOTO

与:

ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID

但是,然后我需要提供一个PHOTO_FILE_ID而不是原始数据。我的问题:

  1. 如何保存照片(字节[])并获取PHOTO_FILE_ID?
  2. 如果已经有可用的照片(PHOTO不是PHOTO_FILE_ID)。我需要删除它才能看到大图像,还是要优先处理大图像?如果没有,如何删除?

问题答案:

您自己的答案会奏效,但效率不高,因为需要将照片编码为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.
    }
}

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

不幸的是没有办法用openAssetFileDescriptorPHOTO_FILE_ID,所以你不能覆盖使用这种方法的ID标识的特定照片。但是,在现实生活中,大多数联系人最多只能有一张照片,所以这并不是一个真正的限制。

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



 类似资料:
  • 问题内容: 我正在尝试直接从我的应用程序更新我的电话簿的联系人。我可以添加和删除联系人,但是更新什么也没做! 在插入之后或当我抓住联系人时,我将收集CONTACT_ID(又称_ID)。 这是我的更新代码: 给我当前联系人的_ID值。 并给我联系人的名字。 给我他的照片uri。最后给我他的电话号码。 Log行为我提供了正确的_ID值,我认为问题不出在这里。我做错什么了吗? 谢谢。 问候。 V. 整个

  • 问题内容: 给定透明的PNG以白色显示简单形状,是否有可能通过CSS更改其颜色?某种覆盖还是什么? 问题答案: 您可以将筛选器与和一起使用:筛选器相对于浏览器而言是较新的,但根据以下CanIUse表,超过90%的浏览器均支持它们 您可以将图像更改为灰度,棕褐色等(请看示例)。 因此,您现在可以使用滤镜更改PNG文件的颜色。

  • 问题内容: 当iPhone的联系人有插入/更新事件时,我想得到通知。 是否可以收到有关特定联系人更改事件发生的通知给我的应用程序? 只是一个新手…对于IOS Swift。 我不期望完整的源代码。只是想知道它是否可能,并暗示。 提前致谢。 问题答案: 在iOS中,可以使用- 注册外部更改回叫通知器 实施回拨-

  • 基本上,我有一个方法可以将Image从数据库加载到ImageView中,还有第二个方法可以更改图像,我成功地运行了这两个方法,没有出现异常,但是在change eImage()方法中的setImage之后,我需要更新什么以及如何(场景、阶段)是可能的。我知道在javafx中没有像swings中的repaint()这样的方法,那么我该如何处理呢?

  • 我正在尝试创建以下图库: -一个大图像 -下面图库图像的缩略图 -大图像应在lightbox图库中单击后打开所有图像 我让lightbox画廊使用PhotoSwipe工作,当我点击大图像时,它就会触发。我也有缩略图在大图像下面的地方。我现在的问题是,当我单击其中一个缩略图时,我如何改变大图像?我见过很多例子(也是相当简单的例子),但在我的案例中似乎没有一个行得通。 下面是我为缩略图准备的代码: 我

  • 我刚刚在文件夹下添加了一个新的可绘制文件夹。在drawable文件夹中,我复制了ic\U启动器。png文件来自可绘制hdpi文件夹。当我按下按钮时,我想通过新的图像更改标准的图像按钮。我写了一些代码,但当我启动应用程序时,它崩溃了。 编辑:我改成了这个,这个也不行。 编辑2:这很有效。感谢大家。