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

时间:2013-07-22 13:47:54

标签: java android image contact

我有一张照片,存放在Android手机中。我希望能够改变联系人的图片。

到目前为止我所做的是启动联系人选择器,让用户选择一个联系人,然后我获得所选联系人的URI。通过此联系人,我可以获得关联的rawContact,并使用this code

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<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);

这就像魅力一样。希望它有所帮助

1 个答案:

答案 0 :(得分:1)

if the branch name( input parameter)= development 
then build name= development

if the branch name = master then build name= master.