Intereting Posts
Как запустить приложение meteor на устройстве Android? Как использовать дерево зависимостей Gradle для разрешения несоответствия версии библиотеки поддержки Android? Неоднозначное поведение нового символа линии Какова цель FeedReaderContract и как определить внутренний класс в OpenHelper Class Разница между `initLoader` и` restartLoader` в `LoaderManager` Откройте встроенную камеру Android с помощью OpenCV Ошибка Nexus One / Android «процессор может быть привязан» Полосы прокладки остаются при прокрутке GridView Java.lang.NoSuchMethodError: Нет виртуального метода keySet () Android: какое событие срабатывает при появлении экранной клавиатуры? Разница между компиляцией и компиляцией дерева против компиляции файлов? Запустить анимацию при загрузке страницы, остановить загрузку страницы Пользовательский глобальный класс приложения разбивается на "android.app.Application не может быть отброшен в" Как извлечь значения из пакета в Android Алгоритм шума в Samsung Galaxy SIII (GLES)

Изменение изображения контакта на большую фотографию с помощью PHOTO_FILE_ID в Android

Кажется, это работает для небольших изображений:

ContentValues values = new ContentValues(); values.put(ContactsContract.Data.RAW_CONTACT_ID, id); 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 (photoRow >= 0) { context.getContentResolver().update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null); } else { context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values); } 

Из документов я понимаю, что для больших изображений мне нужно установить PHOTO_FILE_ID, поэтому я могу заменить:

 ContactsContract.CommonDataKinds.Photo.PHOTO 

с:

 ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID 

Однако тогда мне нужно предоставить PHOTO_FILE_ID, а не сырые данные. Мой вопрос:

  1. Как сохранить фотографию (байт []) и получить PHOTO_FILE_ID?
  2. Если уже имеется фотография (PHOTO не PHOTO_FILE_ID). Нужно ли его удалять для большого изображения, которое нужно увидеть, или имеет ли большое изображение приоритет, если нет, как его удалить?

Solutions Collecting From Web of "Изменение изображения контакта на большую фотографию с помощью PHOTO_FILE_ID в Android"

Ваш собственный ответ будет работать, но он не очень эффективен, потому что фотография должна быть закодирована в SQL-запрос и отправлена ​​через Android IPC. Это также делает его объектом ограничения размера IPC для Android в размере 1 МБ (т. Е. Если ваша фотография слишком велика, операция поставщика контента не будет выполнена).

Самый эффективный способ установить (создать или переопределить) фотографию RawContact (первичная) – с помощью openAssetFileDescriptor и openAssetFileDescriptor ContactsContract.RawContacts.DisplayPhoto URI, как это (пример скопирован из Android-документов):

 public void writeDisplayPhoto(long rawContactId, byte[] photo) { Uri rawContactPhotoUri = Uri.withAppendedPath( ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), RawContacts.DisplayPhoto.CONTENT_DIRECTORY); try { AssetFileDescriptor fd = getContentResolver().openAssetFileDescriptor(rawContactPhotoUri, "rw"); OutputStream os = fd.createOutputStream(); os.write(photo); os.close(); fd.close(); } catch (IOException e) { // Handle error cases. } } 

Единственным недостатком этого подхода является то, что он всегда создает / заменяет основную фотографию RawContact . Если у RawContact еще нет фотографии, это добавит ее.

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

Это автоматически обновит столбец Photo.PHOTO с миниатюрой большой фотографии и назначит PHOTO_FILE_ID .

Наконец удалось решить эту проблему:

 public void changeContactImage(String contactId, byte[] b) { ArrayList < ContentProviderOperation > ops = new ArrayList < > (); ops.add(ContentProviderOperation .newUpdate( ContactsContract.Data.CONTENT_URI) .withSelection( ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?", new String[] { contactId, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) .withValue(ContactsContract.CommonDataKinds.Photo.DATA15, b).build()); // Do something with the phone number... try { context.getContentResolver(). applyBatch(ContactsContract.AUTHORITY, ops); } catch (RemoteException e) { Log.d("RemoteException", e.toString()); } catch (OperationApplicationException e) { Log.d("OperationException", e.toString()); } } 

PHOTO_FILE_ID – это идентификатор файла (смущающе), но строки в базе данных, содержащей ваши необработанные фотоданные. Согласно документам, на которые я смотрел, вы можете вообще не использовать его ( из документов ):

В разделе PHOTO_FILE_ID

Если присутствует, это будет использоваться для заполнения PHOTO_URI

И под PHOTO_ID ( который гарантированно заполняется, если существует PHOTO_FILE_ID )

Ссылка на строку в таблице данных, содержащей фотографию. Фотография может быть указана либо по ID (это поле), либо по URI (см. PHOTO_THUMBNAIL_URI и PHOTO_URI)

Это означает, что если вы просто используете PHOTO_URI вы получите то же самое изображение, как если бы вы сделали метод openDisplayPhoto . Это также предполагает, что методы URI лучше совместимы с каталогами третьей части, поэтому, вероятно, предпочтительнее работать с

Вы можете получить контактную фотографию uri, не используя ContactsContract.CommonDataKinds.Email.PHOTO_URI следующим образом: Читать полный ответ здесь Подробнее

Где! Для получения контактного URI, как вы сказали, попробуйте это:

 import android.provider.ContactsContract.PhoneLookup; public String fetchContactIdFromPhoneNumber(String phoneNumber) { Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Cursor cursor = this.getContentResolver().query(uri, new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID }, null, null, null); String contactId = ""; if (cursor.moveToFirst()) { do { contactId = cursor.getString(cursor .getColumnIndex(PhoneLookup._ID)); } while (cursor.moveToNext()); } return contactId; } 

Чтобы получить идентификатор conatct с использованием номера телефона, используйте следующий код:

 import android.provider.ContactsContract.PhoneLookup; public String fetchContactIdFromPhoneNumber(String phoneNumber) { Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Cursor cursor = this.getContentResolver().query(uri, new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID }, null, null, null); String contactId = ""; if (cursor.moveToFirst()) { do { contactId = cursor.getString(cursor .getColumnIndex(PhoneLookup._ID)); } while (cursor.moveToNext()); } return contactId; 

}

И используйте идентификатор контакта, полученный для получения URI contatc photo. Используйте следующий код для получения URI фотографий:

 import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; public Uri getPhotoUri(long contactId) { ContentResolver contentResolver = getContentResolver(); try { Cursor cursor = contentResolver .query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + "=" + contactId + " AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", null, null); if (cursor != null) { if (!cursor.moveToFirst()) { return null; // no photo } } else { return null; // error in cursor process } } catch (Exception e) { e.printStackTrace(); return null; } Uri person = ContentUris.withAppendedId( ContactsContract.Contacts.CONTENT_URI, contactId); return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); } 

Пожалуйста, дайте мне знать, если это не ответит на ваш вопрос