【问题标题】:Android change contact pictureAndroid更改联系人图片
【发布时间】:2014-09-09 17:15:43
【问题描述】:

我正在构建一个应用程序,当单击图像时,用户会看到联系人列表并选择一个。单击它后,它的联系人图片应更改为首先单击的图像。 以下是我的实现方式:

....
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???
            }
        }
    }

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

【问题讨论】:

    标签: android android-intent contacts


    【解决方案1】:

    首先,获取联系人第一个原始联系人的 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"/>
    

    【讨论】:

    • 感谢您的建议,但我的应用程序在执行第一部分代码时会卡住
    • 当我改变照片时,它被改变了,我可以在电话簿应用程序上看到它。但几秒钟后,它会自动恢复(如果没有以前的照片,则将其删除)。我怀疑这与 Google 帐户同步有关。关于如何解决它的任何想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多