android– 这是如何正确地将照片设置为地址簿上的联系人?

android– 这是如何正确地将照片设置为地址簿上的联系人?,第1张

概述背景假设我通过在地址簿上使用一些查询找到了联系人.通过执行查询来获取它来从特定帐户(如WhatsApp)获取联系信息,因为我写了here.现在我有一个图像,我希望用它来更新联系人的照片.问题我已根据我在StackOverflow上找到的内容创建了代码,用于更新联系人照片.事实上,一些用户声

背景

假设我通过在地址簿上使用一些查询找到了联系人.通过执行查询来获取它来从特定帐户(如WhatsApp)获取联系信息,因为我写了here.

现在我有一个图像,我希望用它来更新联系人的照片.

问题

我已根据我在StackOverflow上找到的内容创建了代码,用于更新联系人照片.

事实上,一些用户声称它没有做任何事情.我不确定是什么原因造成的.也许访问联系人的方式不好(ID / lookup-key?).也许我需要一个额外的地址簿字段.也许查询本身是错误的……

我在弄清楚这个问题的原因时遇到了问题,因为我无法重现它,大多数用户也是如此.

代码

这是我做的:

        final ArrayList<ContentProvIDerOperation> ops = new ArrayList<>();        final String lookupKey=...;        try {            fileinputStream fileinputStream = new fileinputStream(file);            final byte[] photoByteArray = new byte[(int) file.length()];            fileinputStream.read(photoByteArray);            fileinputStream.close();            final Builder builder = ContentProvIDerOperation.newUpdate(Data.CONTENT_URI);            builder.withSelection(Data.LOOKUP_KEY + "=?" + " AND " + Data.MIMETYPE + "=?", new String[]{lookupKey, Photo.CONTENT_ITEM_TYPE});            builder.withValue(Photo.PHOTO, photoByteArray);            ops.add(builder.build());            file.delete();        } catch (IOException e) {            e.printstacktrace();        }        context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops )

这个问题

代码有什么问题吗?

我应该以不同方式更新联系人吗

为什么有些用户无法更新?查找键不够用吗?它可以更新错误的数据吗?

我读过某些地方,我可能需要使用RAW-contact-ID,但无法找到准确的 *** 作.查询然后更新/插入?

有人建议开发人员应考虑使用他们的应用帐户来保存照片,而不是更新,因为它可能会导致问题.这是真的吗?

解决方法:

我在代码中看到了许多可能的问题:

>您假设存在为该联系人存储的现有照片(您正在使用newUpdate),如果当前没有照片,则应该执行newInsert.
>您应该更新/插入特定的RawContact,您所写的内容更新所有Contact的RawContacts照片数据原始数据,一些RawContacts可能具有只读状态,并且不允许您的应用程序修改它.
>处理照片,尤其是将照片存储到“联系人”数据库​​中时,这是一项内存非常紧张的 *** 作,对于某些设备,它可能会因OutOfMemoryError而崩溃,原因可能是内存非常有限,或者因为内存目前被其他内容大量使用.您应该使用try / catch包装整个代码,包括applyBatch,并捕获所有异常/错误并将它们报告给日志,最好也报告给您的错误报告库(Firebase / crashlytics / etc)
>您只是更新数据原始的PHOTO字段,您还应该更新PHOTO_file_ID字段,因为某些应用可能会选择读取PHOTO_file_ID并从中获取照片.
>您没有将新照片设置为其联系人的SUPER_PRIMARY,因此如果同一个联系人中的其他RawContact也有照片,则可能“赢”,并成为该联系人的主要照片.

这里的代码应该有所帮助:

// To simplify the code i dIDn't worry about try/catch, freeing resources, // or running slow querIEs on the main thread, make sure your code does!public ContentProvIDerOperation setPhoto(int contactID, byte[] photoByteArray) {    long rawID = getRawID(contactID);    ContentProvIDerOperation.Builder builder;    String selection = Data.RAW_CONTACT_ID + " = '" + rawID + "' AND " + Data.MIMETYPE + "= '" + Photo.CONTENT_ITEM_TYPE + "'";    Cursor cur = contentResolver.query(Data.CONTENT_URI, new String[]{ Data._ID }, selection, null, null);    if (cur.movetoFirst()) {        // this RawContact already has a photo!        Long photoDataID = cur.getLong(0);        Uri uri = ContentUris.withAppendedID(Data.CONTENT_URI, photoDataID);        builder = ContentProvIDerOperation.newUpdate(uri);    } else {        // this RawContact has no photo.        builder = ContentProvIDerOperation.newInsert(Data.CONTENT_URI);        builder.withValue(Data.RAW_CONTACT_ID, rawID);    }    builder.withValue(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);    builder.withValue(Data.IS_SUPER_PRIMARY, 1);    builder.withValue(Data.IS_PRIMARY, 1);    builder.withValue(Photo.PHOTO, photoByteArray);    builder.withValue(Photo.PHOTO_file_ID, null);    return builder.build();}private long getRawID(long contactID) {    String selection = RawContacts.CONTACT_ID + "='" + contactID + "'";    Cursor cur = contentResolver.query(RawContacts.CONTENT_URI, new String[]{ RawContacts._ID }, selection, null, null);    try {        if (cur.movetoNext()) {            return cur.getLong(0);        }    } finally {        cur.close();    }    return 0;}
总结

以上是内存溢出为你收集整理的android – 这是如何正确地将照片设置为地址簿上的联系人?全部内容,希望文章能够帮你解决android – 这是如何正确地将照片设置为地址簿上的联系人?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1118453.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存