Android:使用 ContactsContract 插入意​​图设置联系人照片

标签 android contacts photo contactscontract

我正在使用 ContactsContract 通过将用户发送到“新联系人” Intent 来插入新联系人。我使用的代码是:

Intent i = new Intent(Intent.ACTION_INSERT);

i.setType(Contacts.CONTENT_TYPE);
i.putExtra(Insert.NAME, "Some Contact Name");
i.putExtra(Insert.EMAIL, "address@email.com");
i.putExtra(Insert.PHONE, "123-456-7890");

startActivity(i);

但是,我还需要以某种方式传入本地存储的照片(在 res/drawable 中)以显示此“新联系人” Intent 。我希望有一种简单的方法可以做到这一点,比如

i.putExtra(Insert.PHOTO, uri_to_photo);

但这显然行不通。我发现 this thread 详细说明了如何为现有联系人设置照片(通过 Jak 的 setPhoto() 方法),但没有关于如何传递照片以显示为“新联系人” Intent 上的联系人图标。

将照片(希望作为照片的 URI)传递到“新联系人” Intent 的最佳方式是什么?

提前致谢。

最佳答案

首先使用ContentProviderOperation的方式插入一个新的Contact。

final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                .build());

        Bitmap bmp = YCardImageLoader.getInstance().getBitmapByCache(mTask.getImageUrl());
        if (bmp != null ) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(CompressFormat.JPEG, 100, stream);
            byte[] bytes = stream.toByteArray();

            ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                    .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                    .withValue(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE)
                    .withValue(Photo.PHOTO, bytes)
                    .build());
        }

        ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.DISPLAY_NAME, mContact.getName())
                .build());

        ContentProviderResult[] result = SaveToPbkActivity.this.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

然后获取结果 uri 作为 ACTION_EDIT uri,放入其他额外内容,startActivityForResult(intent, REQUEST_INSERT_CONTACT)。

        Intent editIntent = new Intent(Intent.ACTION_EDIT);
        uri = result[0].uri;
        editIntent.setDataAndType(uri, Contacts.CONTENT_ITEM_TYPE);
        editIntent.putExtra("finishActivityOnSaveCompleted", true);
        putExtras(editIntent, null);
        startActivityForResult(editIntent, REQUEST_INSERT_CONTACT);

因为我们是先插入的,所以当resultCode != RESULT_OK时我们会删除

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
    if (requestCode == REQUEST_INSERT_CONTACT) {
        if (resultCode == RESULT_OK) {
            //SAVE SUCCESS
        } else {
            ContentResolver cr = getContentResolver();
            cr.delete(uri, null, null);
        }
    } }

最后对不起我的英语!

关于Android:使用 ContactsContract 插入意​​图设置联系人照片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446267/

相关文章:

java - 自 API 29 以来,小部件点击振动不起作用

contacts - 在哪里可以找到适用于 .NET 的 Google.Apis.Contacts.v3?

zend-framework - WordPress 和 Zend

android - 在 Android 上使用相机时,onActivityResult 无法与 RESULT_OK、RESULT_CANCEL 等一起使用

android - Text to Speech 在 Android 4.2 Jelly Bean 中不起作用

android - 从 Fragment 更改 ActionBar 标题

android - 更新联系人显示名称

ios - 如何从自定义相册中获取所有图像 - Swift

android - 处理 Base64 字符串图像太慢?

java - 获取特定位置java上的字符串文本或编辑文本