安卓如何更改联系人头像

3

我正在开发一款应用,当用户点击图片时,会显示联系人列表并选择其中一个联系人。在点击后,该联系人的图片应更改为先前单击的图片。

以下是我的实现方式:

....
Intent intent = new Intent(Intent.ACTION_PICK, People.CONTENT_URI);
startActivityForResult(intent, SELECT_CONTACT);
.....
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_CONTACT) {
                Uri contactData = data.getData();
                ????? what should come here???
            }
        }
    }

我的问题是如何访问和更改联系人头像?谢谢

1个回答

12

首先,获取第一个联系人的Uri:

Uri rawContactUri = null;
Cursor rawContactCursor =  managedQuery(
        RawContacts.CONTENT_URI, 
        new String[] {RawContacts._ID}, 
        RawContacts.CONTACT_ID + " = " + contactData.getLastPathSegment(), 
        null, 
        null);
if(!rawContactCursor.isAfterLast()) {
    rawContactCursor.moveToFirst();
    rawContactUri = RawContacts.CONTENT_URI.buildUpon().appendPath(""+rawContactCursor.getLong(0)).build();
}
rawContactCursor.close();

然后,将位图转换为字节数组:

Bitmap bit; // <-- put your bitmap here
ByteArrayOutputStream streamy = new ByteArrayOutputStream(); 
bit.compress(CompressFormat.PNG, 0, streamy); 
byte[] photo = streamy.toByteArray();

最后,将字节数组设置为原始联系人的照片:

ContentValues values = new ContentValues(); 
int photoRow = -1; 
String where = ContactsContract.Data.RAW_CONTACT_ID + " == " + 
    ContentUris.parseId(rawContactUri) + " AND " + Data.MIMETYPE + "=='" + 
    ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'"; 
Cursor cursor = managedQuery(
        ContactsContract.Data.CONTENT_URI, 
        null, 
        where, 
        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, photo); 
values.put(ContactsContract.Data.MIMETYPE, 
        ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 
if(photoRow >= 0){ 
    this.getContentResolver().update(
            ContactsContract.Data.CONTENT_URI, 
            values, 
            ContactsContract.Data._ID + " = " + photoRow, null); 
    } else { 
        this.getContentResolver().insert(
                ContactsContract.Data.CONTENT_URI, 
                values); 
    } 
} 

编辑

确保在您的清单中包含以下两个权限:

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>

谢谢你的建议,但是我的应用程序在执行代码的第一部分时崩溃了。 - maephisto
当我更改照片时,它会被更改并且我可以在电话簿应用程序中看到它。但是几秒钟后,它会自动恢复(如果之前没有照片,则会被删除)。我怀疑这与Google帐户同步有关。有什么解决方法吗? - cprcrack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接