以编程方式更改联系人图片

我有一张照片,存放在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总是空的(当我调用它的长度时,我们总是得到-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(); 

然后我必须得到RawContacts的Data._ID(与上面相同)。

然后我使用了ContentProviderOperations:

 final ArrayList ops = new ArrayList(); 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); 

这就像魅力一样。 希望能帮助到你

 String contactId ="10001"; // change it as your IDs if (mBitmap != null) { // Picture try { ByteArrayOutputStream image = new ByteArrayOutputStream(); mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, image); Uri rawContactUri = null; Cursor rawContactCursor = managedQuery( ContactsContract.RawContacts.CONTENT_URI, new String[]{ContactsContract.RawContacts._ID}, ContactsContract.RawContacts.CONTACT_ID + " = " + contactId, null, null); if (!rawContactCursor.isAfterLast()) { rawContactCursor.moveToFirst(); rawContactUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendPath("" + rawContactCursor.getLong(0)).build(); } rawContactCursor.close(); ContentValues values = new ContentValues(); int photoRow = -1; String where111 = ContactsContract.Data.RAW_CONTACT_ID + " == " + ContentUris.parseId(rawContactUri) + " AND " + ContactsContract.Data.MIMETYPE + "=='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"; Cursor cursor = managedQuery( ContactsContract.Data.CONTENT_URI, null, where111, null, null); int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID); if (cursor.moveToFirst()) { photoRow = cursor.getInt(idIdx); } cursor.close(); values.put(ContactsContract.Data.RAW_CONTACT_ID, ContentUris.parseId(rawContactUri)); values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray()); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); if (photoRow >= 0) { getContentResolver().update( ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null); } else { getContentResolver().insert( ContactsContract.Data.CONTENT_URI, values); } } catch (Exception e) { Log.e("!_@@Image_Exception", e + ""); } } try { getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); } catch (Exception e) { Log.e("@@@@@UPLOADERR", e + ""); }