更新联系人图片 - 支持其他提供程序,如 Outlook



底部的代码显示了我如何从我的应用程序更新联系人图片。如果用户使用SIM卡,电话和Google联系人等,则效果很好。但是,如果他使用 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);
}

每个SyncAdapters都有一个名为supportsUploading的配置设置为true或false。您不应该修改由 SyncAdapter 同步的帐户的原始联系人,并将 supportsUpload 设置为 false,因为您的更改很可能会很快被 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 同步的联系人,您可以在自己的帐户(最好是在您自己的 SyncAdapter 下)创建一个新的 RawContact,并将该新 RawContact 与 Outlook 创建的现有 RawContact 联接,然后您可以在自己的图片上设置SUPER_PRIMARY,因此它将是默认图片。

最新更新