ContactsContract.Intents.Insert 中的大多数/所有值都在默认联系人应用程序的 model/EntityModifier.java 类中进行处理 - 这只是将 Insert.NAME 中的值填充到 StructuredName.GIVEN_NAME 中。
您可以尝试将其作为支持所有名称组件的 vCard 2.1 (text/x-vcard) 导入,但要求您将 vCard 文件转储到 sdcard 上或提供 ContentResolver#openInputStream(Uri) 可以读取的内容(通常是sdcard 上的文件或指向您自己的 ContentProvider 的 URI)。
一个使用 ContentProvider 动态创建 vCard 的简单示例:
在您的活动中:
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 那样的脑死编码。
从好的方面来说,此方法还允许您添加工作/手机号码和其他号码(以及更多)。