
背景
假设我通过在地址簿上使用一些查询找到了联系人.通过执行查询来获取它来从特定帐户(如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 – 这是如何正确地将照片设置为地址簿上的联系人?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)