Изменить изображение контакта программно

У меня есть картинка, которая хранится в телефоне Android. Я хочу иметь возможность изменить изображение контакта.

На данный момент я запустил средство выбора контактов, чтобы пользователь выбрал контакт, а затем я получил URI выбранного контакта. Из этого контакта я могу получить связанный rawContact и используюэтот код.

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 всегда пуст (когда я вызываю length для него, мы всегда получаем -1).

Я не спрашиваю о полном решении, просто приведу некоторые примеры, которые могут помочь мне в этом. Я не могу найти эту проблему уже на StackOverflow, поэтому любая помощь будет оценена.

РЕДАКТИРОВАТЬ

Всегда, когда мы задаем вопрос, мы находим решение. Я хочу поделиться этим для других

Поэтому я отказался от ссылки Android и нашел другую:http://wptrafficanalyzer.in/blog/programatically-adding-contacts-with-photo-using-contacts-provider-in-android-example/

Средство выбора изображений возвращает Uri выбранного контакта, поэтому вы можете получить Contact._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);

И это работает как шарм. Надеюсь, это поможет