【问题标题】:Android: set contact photo with ContactsContract insert intentAndroid:使用 ContactsContract 插入意​​图设置联系人照片
【发布时间】:2011-06-22 20:37:55
【问题描述】:

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

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 中)以显示在此“新联系人”意图中。我希望有一种简单的方法可以做到这一点,比如

i.putExtra(Insert.PHOTO, uri_to_photo);

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

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

提前致谢。

【问题讨论】:

    标签: android contacts photo contactscontract


    【解决方案1】:

    首先使用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,放上其他extra,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);
            }
        } }
    

    终于对不起我的英语了!

    【讨论】:

      【解决方案2】:

      尝试此代码以使用意图添加带有联系人详细信息的图像

       var bit = BitmapFactory.decodeResource(getResources(), R.drawable.yourimagename); // your image
          val data = ArrayList<ContentValues>();
          var row = ContentValues();
          row.put(ContactsContract.Contacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
          val stream = ByteArrayOutputStream()
          bit.compress(Bitmap.CompressFormat.PNG, 100, stream)
          val byteArray = stream.toByteArray()
          bit.recycle()
          row.put(ContactsContract.CommonDataKinds.Photo.PHOTO, byteArray);
          data.add(row)
          var intent = Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
          intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data);
          intent.putExtra(ContactsContract.Intents.Insert.NAME, name);
          intent.putExtra(ContactsContract.Intents.Insert.PHONE, phone1);
          intent.putExtra(ContactsContract.Intents.Insert.SECONDARY_PHONE, phone2);
          intent.putExtra(ContactsContract.Intents.Insert.EMAIL, email);
          context.startActivity(intent);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多