- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我通过使用地址簿上的一些查询找到了一个联系人。正如我所写的那样,通过执行查询以从特定帐户(如 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-ids,但找不到具体的操作方法。查询然后更新/插入?
有人建议开发者应该考虑使用他们应用程序的帐户来保存照片,而不是更新,因为这可能会导致问题。是真的吗?
最佳答案
我在代码中看到了一些可能的问题:
newUpdate
),如果当前没有照片,您应该执行 newInsert
相反。OutOfMemoryError
而崩溃,因为它们的 RAM 非常有限,或者因为当前内存不足被其他东西大量使用。您应该使用 try/catch 包装包括 applyBatch 在内的整个代码,并捕获所有异常/错误并将它们报告到日志中,最好也报告到您的错误报告库(Firebase/crashlytics/等)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 - 这是如何正确地将照片设置为地址簿上的联系人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45894991/
对于我的应用程序的一部分,我需要在选择该选项时显示所有联系人的列表(带有电话号码)。 这是按下按钮时调用的 Activity : package com.example.prototype01; im
我正在尝试使用 Google Contact API (C#) 将“生日”值添加到 Google Contact。谁能帮我解决这个问题。 我正在使用 Google 数据 API 设置 (1.4.0.2
如何使用 Google Contact API (c#) 在 Google Contact 中创建新的“自定义字段”? 我用过: ExtendedProperty obj_ExtendedProper
我正在 iPhone 应用程序中使用地址簿框架,并且我想获取项目公司名称。我在 AddressBookUI_Framework.pdf 中找不到此信息,有人可以解释一下吗? 问候 AddressBoo
我正在开发一个数据库来管理一家小公司的客户数据。客户是公司和机构(学校等),当然还有人/联系人。会有更多的范围及时添加,但现在我正在寻找关于核心设计本身的任何输入,如果有任何我在这里遗漏的东西可能会导
我正在使用 Swift Contacts 并尝试确定是否可以将 contacts.phoneNumbers 转换为 NSDictionary?即可以通过以下方式在 contacts.phoneNumb
我想要我的联系人的 ListView。我使用谷歌示例代码。问题是我一遍又一遍地获得相同的联系人: 吉姆 吉姆 吉姆 吉姆 吉姆 安娜 安娜 安娜 安娜 ... 如何获得我的联系人的 DISTINCT
对于我的应用程序,我需要导入 Gmail 地址簿,我可以按照“Gmail Contact API”进行操作。 最近 Gmail 添加了一些不属于 xml 的新字段(即生日、网站等)。 gmail ap
在 NetSuite 中编辑记录时,我有一个按钮需要能够获取所有联系人的名字、姓氏、电子邮件和可能的 Angular 色,以便我可以将其附加到我已经编写的其他代码中。我似乎无法弄清楚如何提取与记录关联
我们需要一种使用 Delphi/Pascal 代码读取(并且可以选择写入).vcf 文件的方法。带有源代码的免费库将是完美的。 最佳答案 AceVCard是delphi 2009的免费开放组件,兼容V
我正在模拟一个电话簿,其中有 ArrayList 。如何覆盖toString()函数为了拥有像这样的东西,我们正在做 System.out.println(phonebook) ? Name: nam
我正在尝试构建一个搜索 XML 表达式以与 Java 中的 Exchange Web 服务一起使用。我试图实现的是我可以通过电子邮件地址搜索所有联系人。我已经浏览了他们的文档,但未能使其正常工作。这是
我有一个项目正在进行,我想自动发送 SMS,并有时间和日期将 SMS 推送给特定的联系人。那么如何以简洁高效的方式从手机中提取联系人呢?基本上我希望用户按下一个按钮,然后应用程序转到联系人列表,然后用
我有一个表格 View ,显示所有联系人都使用 RealmSwift。如何使用谓词按电话号码过滤 Realm 联系人? class Contact: Object { @obj
我正在尝试使用 CNContactVCardSerialization 将联系人保存为 vcf,效果相对较好。我确实发现苹果不包含注释或图像作为 VCF 的一部分。我确实使用了 stackoverfl
我正在读取手机中的所有联系人,如下所示: Cursor cursor = MainApp.get().getContentResolver().query( C
我有具有 list 权限的应用程序 我的 Activity 尝试加载联系人: eDeviceRecordsLoader contactsLoader = new eDeviceRec
我正在尝试编辑组标题和注释, 编辑标题适用于系统组 和用户创建的组, 虽然注释列只有在系统组(例如“联系人”、“ friend ”、“家庭”、“同事”)时才会保留,我假设它不会为用户创建的组保存注释,
在我的应用中,我想将联系人与其他数据相关联。对联系人的引用必须尽可能持久,否则关联的数据将变成垃圾。 首先,我应该使用 ContactsContract.Contact.LOOKUP_KEY 访问聚合
我正在做一个应用程序,因为我显示从设备到 ListView 的所有联系人(姓名、号码、图像)。我想使用工具栏搜索从 ListView 中搜索联系人。我添加了工具栏搜索,但我不知道如何从列表中过滤联系人
我是一名优秀的程序员,十分优秀!