У меня есть изображение, которое хранится в телефоне android. Я хочу иметь возможность изменить изображение контакта.Смена контактного изображения программно
Что я сделал до сих пор, это запуск выбора контактов, выбор пользователя для контакта, а затем я получаю URI выбранного контакта. Из этого контакта я могу получить связанный с ним rawContact, и я использую this code.
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.
}
Проблема заключается в том, то AssetFIleDescriptor всегда пусто (когда я звоню длину на это, мы всегда получаем -1).
Я не прошу решения в целом, просто некоторые из них приводят к следующему, что может помочь мне получить эту работу. Я не могу найти эту проблему уже на StackOverflow, поэтому любая помощь будет оценена.
EDIT
Это всегда, когда мы задаем на вопрос, что мы найдем решение. я хочу поделиться им для других
Так что я отказался от андроида связи и найти еще один: http://wptrafficanalyzer.in/blog/programatically-adding-contacts-with-photo-using-contacts-provider-in-android-example/
Початкоотделителя картины вернуть Uri выбранного контакта, так что с этим вы можете получить контакт. _ID его:
// This is onActivityResult
final Uri uri = data.getData();
final Cursor cursor1 = getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
final long contactId = cursor1.getLong(cursor1.getColumnIndex(Contacts._ID);
cursor1.close();
Тогда я должен был получить RawContactId:
final Cursor cursor2 = getContentResolver().query(RawContacts.CONTENT_URI, null, RawContacts.Contact_ID + "=?", new String[] {String.valueOf(contactId)}, null);
cursor2.moveToFirst();
final long rawContactId = cursor2.getLong(cursor2.getColumnIndex(RawContacts._ID));
cursor2.close();
Тогда я должен был получить Data._ID RawContacts (так же, как указано выше).
Тогда я использовал ContentProviderOperations:
final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(Data._ID, dataId),
.withValue(Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, byteArrayOfThePicture);
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
И это работает как шарм. Надеюсь, это поможет
Какие разрешения у вас есть в вашем AndroidManifest.xml? Узел выбора контактов предоставляет временное разрешение READ для полученного URI, но вам необходимо установить разрешение WRITE_CONTACTS для фактического обновления контакта. – Josiah
У меня есть разрешение READ и WRITE_CONTACT. – Tristan