Я пытаюсь установить фотографию контакта с помощью функции в официальных документах по Android здесь , но функция меняет фотографию с совершенно другого контакта, хотя я проверяю contactURI
и contactID
ииспользуйте его, чтобы получить имя контакта и по-прежнему изменяет неправильную фотографию контакта.
Пример теста:
выбранный идентификатор контакта : 4673
значение off rawContactPhotoUri в writeDisplayImage () : content: //com.android.contacts/raw_contacts/4673/display_photo
идентификатор контакта, для которого фотобыло изменено по ошибке: 147
Мой процесс
Я выбираю изображение и затем выбираю контакт с помощью startActivityForResult (), затем выполняю функцию
Мой код
onActivityResult ():
else if (requestCode == SELECT_CONTACT_FOR_RESULT) {
if (resultCode == RESULT_OK) {
contactUri=data.getData();
setContactImage(contactUri, selectedImageURI, MainActivity.this)
} else {
//}
}
setContactImage ()
public static void setContactImage(final Uri rawContactUri, final Uri selectedImageURI, final Activity activity, final boolean isFromShare) {
final String nameString = getContactName(rawContactUri, activity);//get name using URI
final long contactID = ContentUris.parseId(rawContactUri);
if (writeDisplayPhoto(activity, contactID, getByteFromIMGUri(activity, selectedImageURI))) {//success toast }
writeDisplayImage ()
private static boolean writeDisplayPhoto(Activity activity, long contactID, byte[] photo) {
Uri rawContactPhotoUri = Uri.withAppendedPath(
ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactID),
ContactsContract.RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
Debug.d(activity, "contactID: " + contactID + "rawContactPhotoUri: " + rawContactPhotoUri);
try {
AssetFileDescriptor fd =
activity.getContentResolver().openAssetFileDescriptor(rawContactPhotoUri, "rw");
OutputStream os = fd.createOutputStream();
os.write(photo);
os.close();
fd.close();
return true;
} catch (IOException e) {
Debug.e(activity, "Write Photo EXCEPTION: " + e);
return false;
// Handle error cases.
}
}
getContactName ()
static String getContactName(Uri rawContactUri, Context context) {
Cursor cursor; // Cursor object
cursor = context.getContentResolver().query(rawContactUri, null, null, null, null);
cursor.moveToFirst();
int phoneIndex = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);
String string = cursor.getString(phoneIndex);
cursor.close();
Debug.d(context, "Name: " + string + " ,ID: " + ContentUris.parseId(rawContactUri) + " ,URI: " + rawContactUri, false);
return string;
}