Я единственный, кто пытается достичь этого...:/?
Короче:
Я хочу вернуть изображение моих контактов, поскольку они сами определили его (например, на их собственной странице собственной учетной записи Google).
Случай использования: Я сам изменил одно из своих изображений контактов, и теперь я хочу отменить это изменение → Я хочу "вернуть" изображение Google моего контакта (одно установленный им самим).
У меня есть приложение, которое управляет контактами Google. Он также управляет фотографией контакта, используя
КонтактыContract.CommonDataKinds.Photo.PHOTO
И он отлично работает.
Вот сценарий, который я хотел бы поддержать:
- Я добавляю новый контакт в мой список контактов, вводя его в адрес gmail. (OK)
- Через некоторое время контактная фотография доступна в моем приложении для контактов (так как контакт имеет изображение в его учетной записи Google, а контактная синхронизация включена на устройстве Android). (OK)
- В моем приложении я меняю изображение контакта приложения (так, я 'переопределяю' контактное изображение) (OK)
- В моем приложении, я хочу вернуть изображение по умолчанию Google: Не в порядке. Как я могу это достичь?
Пожалуйста, посмотрите мой код здесь, чтобы установить фотографию. Должен ли я просто "очистить" фотографию и полагаться на ContactProvider, чтобы загрузить фотографию пользователя из учетной записи Google?
Как очистить фотографию. Установить КонтактыContract.CommonDataKinds.Photo.PHOTO на 'null'? и удалить связанный файл, т.е.
Uri rawContactPhotoUri = Uri.withAppendedPath(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), RawContacts.DisplayPhoto.CONTENT_DIRECTORY)
Спасибо за помощь.
Вот как я обновляю изображение:
private void updatePhotoThumbnail(Bitmap bitmap, Contact contact) throws Exception
{
byte[] contactPhotoBytes = getContactPhotoBytes(bitmap);
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
// @formatter:off
String where = ContactsContract.RawContacts.ACCOUNT_NAME + "= ? "
+ "AND " + ContactsContract.RawContacts.ACCOUNT_TYPE + "= ? "
+ "AND " + ContactsContract.Data.CONTACT_ID + "= ? "
+ "AND " + ContactsContract.Data.RAW_CONTACT_ID + "= ? "
+ "AND " + ContactsContract.Data.MIMETYPE + " = ?";
// @formatter:on
String[] params = new String[]
{
// @formatter:off
_accountName,
AccountManagerHelper.GOOGLE_ACCOUNT_TYPE,
String.valueOf(contact.getId()),
String.valueOf(contact.getRawContactId()),
ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
// @formatter:on
};
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).withSelection(where, params)
.withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, contactPhotoBytes).build());
try
{
_contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
updateDisplayPhoto(contact.getRawContactId(), contactPhotoBytes);
}
catch (RemoteException e)
{
e.printStackTrace();
throw new Exception(e.getMessage());
}
catch (OperationApplicationException e)
{
e.printStackTrace();
throw new Exception(e.getMessage());
}
}
private void updateDisplayPhoto(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)
{
e.printStackTrace();
}
}