Когда не удается установить изображение контактов через ContentProvider и ContactsContract - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь обновить изображения контактов через ContentProvider в моем приложении.Это работает почти всегда (я использую этот метод около 4 лет в производственном приложении, с ~ 50000 пользователей и 1M загрузок).У меня почти никогда не бывает проблем, но кажется, что функция не пуленепробиваема.Он не работает на устройстве одного пользователя несколько раз, и я не знаю, почему.

Что я делаю

Я просто имею растровое изображение и пытаюсь сохранить, если для известного идентификатора контакта,Если у контакта уже есть изображение, я заменяю его, в противном случае я добавляю изображение.

Result and Quesiton

Изображение контакта не обновляется на устройстве одного пользователя.В журнале написано, что у неисправного контакта еще нет изображения.Это нормально, поэтому я просто создаю новый.Функция возвращает Uri, но это значение равно нулю, поэтому сохранить изображение не удалось.Зачем?Любые идеи?

Информация журнала:

Набор изображений контактов - обновлено: -1, newUri: NULL, старый идентификатор фотографии: -1

Информация об устройстве:

  • другие контакты работают, не работает только несколько контактов
  • на устройстве достаточно свободного места, поэтому источником также не может быть
  • пользователь использует только контакты Google и никакой другой сервис (например, Outlook или аналогичные, поэтому контакты только для чтения или аналогичные)

Код

// the id of the contact
long contactRawId = ...;

// 1) get bitmap
Bitmap bitmap = ...;

// 2) Convert Bitmap to byte
byte[] photo = 

// 3) save or update contact picture via content provider
ContentValues values = new ContentValues();
int photoId = -1;
String where = ContactsContract.Data.RAW_CONTACT_ID + " == " +
        contactRawId + " 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, contactRawId);
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);

int updated = -1;
Uri newUri = null;
if (photoId >= 0) {
    updated = MainApp.get().getContentResolver().update(
            ContactsContract.Data.CONTENT_URI,
            values,
            ContactsContract.Data._ID + " = " + photoId, null);
} else {
    newUri = MainApp.get().getContentResolver().insert(
            ContactsContract.Data.CONTENT_URI,
            values);
}

L.d("Contact image set - updated: %d, newUri: %s, old photoId: %d", updated, newUri, photoId);

Наблюдения

  • у одного парня с этой проблемой был рутированный OnePlus 3t с запущенной Nougat 7.1.1
  • , в то время как он очистил данные приложения, и теперь все контакты работают

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Это не похоже на проблему с кодом, но с телефоном

Неисправность на одном устройстве пользователя неоднократно, и я не знаю, почему.

У меня была похожая проблема с приложением, но другая функциональность.Чтобы решить проблему, вам нужно будет использовать устройство пользователя и отладить приложение (вы можете клонировать его).Наличие проблем на одном устройстве, исключающее другие, показывает, что проблема в устройстве, для него могут потребоваться «странные» разрешения.

0 голосов
/ 09 июня 2018

Возможно, вы запускаете процесс обновления в основном потоке.Переместите процесс обновления в AsyncTask.

Тяжелые задачи или задачи, которые включают асинхронные операции, такие как задачи загрузки, должны всегда перемещаться в другой поток, иначе они будут связаны с потоком пользовательского интерфейса и пропускаются, если они не будутзавершите работу достаточно быстро, что приведет к странным нежелательным эффектам.

...