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);
所以你可以做的是:
- 通过启动SHOW_OR_CREATE_CONTACT帮助用户创建联系人
- 创建联系人后,插入此联系人的显示照片。
我想知道你是否找到了可行的答案。我会发表评论,但我没有足够的积分。我也在寻找一个好的答案。
从文档中,无法显式创建新的触点插入。这意味着需要使用 URI 和值(隐式)插入新的联系人数据。
唯一可能的方法是使用内容提供程序创建新联系人并添加所有字段,包括默认图像。然后,立即使用 ACTION_EDIT 让用户编辑字段。
还要看看Intents.ATTACH_IMAGE