如何使用SHOW_OR_CREATE_CONTACT并为联系人设置照片



Background

我知道可以通过此意图设置各种字段,例如地址,电话号码,姓名等...

final Intent intent = new Intent(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, Uri.parse("tel:" +PhoneNumberService.formatNumber(phoneNumber, PhoneNumberFormat.NATIONAL));
intent.putExtra(ContactsContract.Intents.Insert.NAME, name);
intent.putExtra(ContactsContract.Intents.Insert.POSTAL_ISPRIMARY,address);
intent.putExtra(ContactsContract.Intents.Insert.POSTAL,address);
... //other stuff, like on this post: http://stackoverflow.com/q/3456319/878126

问题所在

我想知道是否可以添加照片。

我尝试过什么

我已经尝试了下一个代码,但它似乎不起作用:

public static byte[] toByteArray(final Bitmap bitmap) {
    if (bitmap == null || bitmap.isRecycled())
        return null;
    final ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    final byte[] byteArray = stream.toByteArray();
    return byteArray;
}

final byte[] imageByteArray = toByteArray(mBitmap);
intent.putExtra(ContactsContract.CommonDataKinds.Photo.PHOTO, imageByteArray);

问题

照片也可以

放吗?如果是这样,如何?

我还试图弄清楚添加是否成功,以便我可以获取联系人密钥并在需要时能够对其进行修改,但似乎"startActivityForResult"在这里没有帮助。

简答

不。

SHOW_OR_CREATE_CONTACT意图开始ShowOrCreateActivity。从文档中:

如果没有要显示的联系人,则ContactsContract.Intents.Insert类中的任何额外内容都将传递到创建活动。

所以ContactsContract.Intents.Insert.POSTAL应该有效,但实际上没有理由ContactsContract.CommonDataKinds.Photo可能起作用。

长答案

从代码中,如果 Uri tel:,则上一个活动通过电话搜索联系人,如果 Uri mailto:,则通过电子邮件搜索联系人,如果未找到,则提示用户,肯定按钮开始创建意图。

            final Intent createIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
            createIntent.putExtras(mCreateExtras);
            createIntent.setType(RawContacts.CONTENT_ITEM_TYPE);

其中mCreateExtras包含您传递给SHOW_OR_CREATE_CONTACT的所有额外内容(请参阅onCreate

根据AndroidManifest的说法,这将启动一个ContactEditorActivity,该设置工具栏并放置一个ContactEditorFragement

旅程快结束了。数据绑定是在bindEditorsForNewContact()中完成的,似乎仅限于RawContactModifier.parseExtras()提供的内容。文档似乎是正确的。

解决方法

但是,还有另一种方法可以直接与内容提供商插入联系人。

 ContentValues values = new ContentValues();
 values.put(RawContacts.ACCOUNT_TYPE, accountType);
 values.put(RawContacts.ACCOUNT_NAME, accountName);
 // This may work (not tested)
 values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, imageByteArray);
 Uri rawContactUri = getContentResolver().insert(ContactsContract.CONTENT_URI, values);
 long rawContactId = ContentUris.parseId(rawContactUri);

所以你可以做的是:

  1. 通过启动SHOW_OR_CREATE_CONTACT帮助用户创建联系人
  2. 创建联系人后,插入此联系人的显示照片。

我想知道你是否找到了可行的答案。我会发表评论,但我没有足够的积分。我也在寻找一个好的答案。

从文档中,无法显式创建新的触点插入。这意味着需要使用 URI 和值(隐式)插入新的联系人数据。

唯一可能的方法是使用内容提供程序创建新联系人并添加所有字段,包括默认图像。然后,立即使用 ACTION_EDIT 让用户编辑字段。

还要看看Intents.ATTACH_IMAGE

最新更新