我正在尝试使用表单中已有的一些数据启动Android原生“添加或编辑联系人”活动。这是我目前使用的代码:
Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
intent.putExtra(Insert.NAME, "A name");
intent.putExtra(Insert.PHONE, "123456789");
startActivity(intent);
我的问题是我想指定名字和姓氏。我还注意到有一个StructuredName类,它包含我需要的所有字段的常量标识符。不幸的是,我无法将StructuredName字段添加到intent ...
有人知道这是如何做得好的吗?
注意:我没有尝试直接添加联系人,但我想打开一个填充的“添加联系人”对话框!
由于 咄
答案 0 :(得分:2)
来自ContactsContract.Intents.Insert
的大多数/所有值都在默认联系人应用程序的model/EntityModifier.java
类中进行处理 - 这只会将Insert.NAME
中的值填入StructuredName.GIVEN_NAME
。
您可以尝试将其导入为vCard 2.1(text / x-vcard),它支持所有名称组件,但要求您在SD卡上转储vCard文件或提供ContentResolver#openInputStream(Uri)
可以读取的内容(通常是SD卡上的文件或指向您自己的ContentProvider的URI。
使用ContentProvider动态创建vCards的简单示例:
在您的活动中:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("content://some.authority/N:Jones;Bob\nTEL:123456790\n"), "text/x-vcard");
startActivity(i);
在您的ContentProvider中(为ACTION_VIEW Intent中使用的权限注册):
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
try {
FileOutputStream fos = getContext().openFileOutput("filename.txt", Context.MODE_PRIVATE);
String vcard = "BEGIN:VCARD\nVERSION:2.1\n" +
uri.getPath().substring(1) +
"END:VCARD\n";
fos.write(vcard.getBytes("UTF-8"));
fos.close();
return ParcelFileDescriptor.open(new File(getContext().getFilesDir(), "filename.txt"), ParcelFileDescriptor.MODE_READ_ONLY);
} catch (IOException e) {
throw new FileNotFoundException();
}
}
这应该在触发时,将您在Uri路径中放置的任何名称的联系人插入电话簿。如果用户有多个联系人帐户,他/她将被要求选择一个。
注意:当然,完全忽略了对vCard的正确编码。我想大多数版本的联系人应用应该支持vCard 3.0,它也不像vCard 2.1那样具有脑死亡编码。
在最重要的方面,此方法还允许您添加工作/移动和其他数字(以及更多)。