writeDisplayPhoto () меняет фотографию другого контакта - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь установить фотографию контакта с помощью функции в официальных документах по 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;
}

1 Ответ

0 голосов
/ 07 октября 2018

Похоже, у вас путаница между Contact ID и RawContact ID.

В ContactsContract контакт состоит из нескольких RawContacts.Идентификатор контакта не совпадает с идентификаторами его RawContacts, и вполне возможно, что тот же идентификатор будет использоваться для некоторого контакта, но также и для совершенно другого RawContact (как вы заметили при обновлении неправильного контакта).

В строке: setContactImage(contactUri, selectedImageURI, MainActivity.this), где вы передаете ContactUri (с идентификатором контакта) методу, который ожидает RawContactUri (с идентификатором RawContact).У вас также есть некоторые ошибки, когда вы получаете идентификатор из RawContactUri и неправильно называете его contactId.

Вот некоторый код для поиска некоторого случайного RawContactUri из заданного ContactUri:

Uri getSomeRawContactUri(Uri contactUri) {
    long contactId = ContentUris.parseId(contactUri);
    String[] projection = new String[] { RawContacts._ID };
    String selection = RawContacts.CONTACT_ID + " = " + contactId;
    Cursor cursor = context.getContentResolver().query(RawContacts.CONTENT_URI, projection, selection, null, null);
    if (cursor != null && cursor.moveToFirst()) {
        long rawContactId = cursor.getLong(0);
        cursor.close();
        Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
        return rawContactUri;
    }
    return null;
}
...