Обновите изображения контактов — поддержите других поставщиков, таких как 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);
}

person prom85    schedule 27.10.2017    source источник


Ответы (1)


Каждый SyncAdapters имеет конфигурацию с именем supportsUploading, для которой установлено значение true или false. Вы не должны изменять RawContacts учетных записей, которые были синхронизированы с помощью SyncAdapter с параметром supportsUploading, равным false, так как, скорее всего, ваше изменение вскоре после этого будет перезаписано SyncAdapter.

Вы можете проверить значение supportsUploading всех SyncAdapters, используя следующий код:

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 только для чтения, вы можете создать новый RawContact под своей учетной записью (желательно под вашим собственным SyncAdapter) и объединить этот новый RawContact с существующим RawContact, созданным Outlook, затем вы можете установить SUPER_PRIMARY на своем собственном изображении, так что это будет по умолчанию один.

person marmor    schedule 29.10.2017
comment
Что произойдет, если другое приложение сделает то же самое — добавит свой собственный адаптер синхронизации и установит свои контакты в качестве основных? Тем не менее, ваше предложение имеет смысл и, кажется, решает проблему и очень хорошо описывает, почему у меня есть проблемы и почему они случаются редко, особенно в сочетании с Outlook... - person prom85; 30.10.2017