根据"Modifying Contacts Using Intents"(Android开发人员文档)和"Start add new contact activity and pass structured data"的答案,我设计了一种方法,用于编辑Android联系人选择器,以及用户编辑和保存的数据。
我也有一个类似的“无头”方法使用ContentProviderOperation
,它适用于我尝试过的所有联系人字段(姓名,电话号码,电子邮件,结构化地址等)。
但是,在使用intent时,结构化地址会以某种方式被丢弃,并且不会出现在联系人选择器中。使用相同方法添加的网站网址可以正常使用。
这是我的代码,有点浓缩:
Intent intent = new Intent(Intent.ACTION_INSERT);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
ArrayList<ContentValues> data = new ArrayList<ContentValues>();
ContentValues addressRow = new ContentValues();
addressRow.put(Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE);
// The string values are prepared earlier, and I check that none of them is null.
// The ContentProviderOperation way doesn't seem to mind nulls, however.
addressRow.put(ContactsContract.CommonDataKinds.StructuredPostal.STREET, street);
addressRow.put(ContactsContract.CommonDataKinds.StructuredPostal.POBOX, pobox);
addressRow.put(ContactsContract.CommonDataKinds.StructuredPostal.NEIGHBORHOOD, neighborhood);
addressRow.put(ContactsContract.CommonDataKinds.StructuredPostal.CITY, city);
addressRow.put(ContactsContract.CommonDataKinds.StructuredPostal.REGION, region);
addressRow.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, postcode);
addressRow.put(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, country);
addressRow.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, addressType);
data.add(addressRow);
// This website address is shown in the contact edit screen, as expected:
ContentValues urlRow = new ContentValues();
urlRow.put(Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE);
urlRow.put(ContactsContract.CommonDataKinds.Website.URL, urlValue);
data.add(urlRow);
intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data);
startActivityForResult(intent, ADD_CONTACT_REQUEST); // my own request code
请注意,使用意图并使用ContentProviderOperation
是实现相同目标的不同方式,两者都适用于各自的方案。我的问题是关于意图,因此以下SO问题的答案并没有太大帮助:
关于我在这里乱搞什么的任何建议?