Zmień programowo zdjęcie kontaktu
Mam zdjęcie, które jest przechowywane w telefonie z Androidem. Chcę móc zmienić zdjęcie kontaktu.
Do tej pory wykonałem selektor kontaktów, wybrałem kontakt, a następnie otrzymałem identyfikator URI wybranego kontaktu. Z tego kontaktu mogę uzyskać powiązany rawContact i używamten kod.
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.
}
Problem polega na tym, że AssetFIleDescriptor jest zawsze pusty (gdy wywołam na nim długość, zawsze otrzymujemy -1).
Nie pytam o całe rozwiązanie, tylko kilka wskazówek, które mogą mi pomóc w uzyskaniu tej pracy. Nie mogę znaleźć tego problemu już na StackOverflow, więc każda pomoc byłaby doceniana.
EDYTOWAĆ
Zawsze, gdy prosimy o pytanie, znajdujemy rozwiązanie. Chcę podzielić się nim z innymi
Więc zrezygnowałem z linku android i znalazłem inny:http://wptrafficanalyzer.in/blog/programatically-adding-contacts-with-photo-using-contacts-provider-in-android-example/
Selektor obrazów zwraca Uri wybranego kontaktu, dzięki czemu można uzyskać jego identyfikator 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();
Potem musiałem zdobyć 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();
Następnie musiałem pobrać Data._ID RawContacts (tak samo jak powyżej).
Następnie użyłem Operacji 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);
I to działa jak urok. Mam nadzieję, że to pomoże