【问题标题】:Update contact pictures - support other providers like outlook更新联系人图片 - 支持其他提供商,如 Outlook
【发布时间】:2017-10-27 06:27:01
【问题描述】:

底部的代码显示了我如何从我的应用中更新联系人图片。如果用户使用 sim、电话和谷歌联系人等类似的,这很好用。但是如果他使用outlook应用程序,outlook应用程序确实会在一段时间后再次覆盖我的应用程序设置的图像。

我能以某种方式解决这个问题吗?我可以强制覆盖 Outlook 图像,以便 Outlook 同步我的新照片而不是旧照片吗?

代码

byte[] photo = ImageUtil.convertImageToByteArray(bitmap, true);
ContentValues values = new ContentValues();
int photoId = -1;
String where = ContactsContract.Data.RAW_CONTACT_ID + " == " +
        contact.getRawId() + " AND " + ContactsContract.Contacts.Data.MIMETYPE + "=='" +
        ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
Cursor cursor = MainApp.get().getContentResolver().query(
        ContactsContract.Data.CONTENT_URI,
        null,
        where,
        null,
        null);
int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID);
if (cursor.moveToFirst()) {
    photoId = cursor.getInt(idIdx);
}
cursor.close();
values.put(ContactsContract.Data.RAW_CONTACT_ID, contact.getRawId());
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 (photoId >= 0) {
    MainApp.get().getContentResolver().update(
            ContactsContract.Data.CONTENT_URI,
            values,
            ContactsContract.Data._ID + " = " + photoId, null);
} else {
    MainApp.get().getContentResolver().insert(
            ContactsContract.Data.CONTENT_URI,
            values);
}

【问题讨论】:

    标签: android android-contacts android-contentresolver contactscontract


    【解决方案1】:

    每个SyncAdapters 都有一个名为supportsUploading 的配置设置为true 或false。 您不应修改由 SyncAdapter 同步且将 supportsUploading 设置为 false 的帐户的 RawContacts,因为您的更改很可能很快就会被 SyncAdapter 覆盖。

    您可以使用以下代码检查所有SyncAdapterssupportsUploading 值:

    final SyncAdapterType[] syncs = ContentResolver.getSyncAdapterTypes();
    for (SyncAdapterType sync : syncs) {
        Log.d(TAG, "found SyncAdapter: " + sync.accountType);
        if (ContactsContract.AUTHORITY.equals(sync.authority)) {
            Log.d(TAG, "SyncAdapter supports contacts: " + sync.accountType + " - supportsUploading=" + sync.supportsUploading());
        }
    }
    

    要为只读 SyncAdapter 同步的联系人设置不同的图片,您可以在自己的帐户 (preferably under your own SyncAdapter) 和 Outlook 创建的join that new RawContact with the existing RawContact 下创建一个新的 RawContact,然后您可以将 SUPER_PRIMARY 设置为你自己的图片,所以它会是默认的。

    【讨论】:

    • 如果另一个应用程序这样做会发生什么 - 添加它自己的同步适配器并将它自己的联系人设置为超级主要?尽管如此,你的建议是有道理的,似乎解决了这个问题,并且很好地描述了为什么我有问题以及为什么这些问题很少发生,尤其是结合前景......
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    相关资源
    最近更新 更多