也許有點晚了,但希望仍然樂於助人的人誰具有相同的問題:
即使Contacts.Intents.Inserts折舊,該ContactsContract.Intents.Insert API仍然沒有通過提供意向加入城市,街道等。要解決此問題,您必須通過使用ContactsContract API以編程方式執行此操作。這裏是我的解決方案:
首先我回應一些「addContactEvent」 - 在我的情況下點擊一個按鈕 - 用吐司。我的addContactToAddressBook方法返回描述操作結果的String Ressource的Id。
int resultId = addContactToAddressBook(myContactObject, this);
Toast.makeText(this, getString(resultId), Toast.LENGTH_SHORT).show();
接下來,我將大量信息添加到聯繫人通訊錄中,如街道,城市,名稱......信息存儲在contactobject中。
public int addContactToAddressBook(MyContactObject contact, Context context){
// is contact already in contacts??
if(contact != null && !numberAlreadyInContacts(contact.getPhoneNumber(), context)){
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();
// prepare Contact
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.build());
// Insert First- and LastName
if(contact.getFirstName() != null && contact.getLastName() != null){
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.DISPLAY_NAME, "Lost Symbol Characters")
.withValue(StructuredName.GIVEN_NAME, contact.getFirstName())
.withValue(StructuredName.FAMILY_NAME, contact.getLastName())
.build());
}
// Insert Organistion and JobTitle
if(contact.getOrganisation() != null && contact.getJobTitle() != null){
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE)
.withValue(Organization.COMPANY, contact.getOrganisation())
.withValue(Organization.TYPE, Organization.TYPE_WORK)
.withValue(Organization.TITLE, contact.getJobTitle())
.withValue(Organization.TYPE, Organization.TYPE_WORK)
.build());
}
// Insert Email
if(contact.getEmailAddress() != null){
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
.withValue(Email.DATA, contact.getEmailAddress())
.withValue(Email.TYPE, Email.TYPE_WORK)
.build());
}
// Insert PhoneNumber
if(contact.getPhoneNumber() != null){
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, contact.getPhoneNumber())
.withValue(Phone.TYPE, Phone.TYPE_WORK)
.build());
}
// Insert MobileNumber
if(contact.getMobileNumber() != null){
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, contact.getMobileNumber())
.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
.build());
}
// Insert Address
if(contact.getStreetAddress() != null && contact.getPostalCode() != null && contact.getLocation() != null && contact.getCountry() != null){
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE)
.withValue(StructuredPostal.COUNTRY, contact.getCountry())
.withValue(StructuredPostal.POSTCODE, contact.getPostalCode())
.withValue(StructuredPostal.CITY, contact.getLocation())
.withValue(StructuredPostal.STREET, contact.getStreetAddress())
.build());
}
// add to DB
try {
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
return R.string.contact_added;
} catch (RemoteException e) {
return R.string.adding_contact_failed;
} catch (OperationApplicationException e) {
return R.string.adding_contact_failed;
}
} else if(contact != null && numberAlreadyInContacts(contact.getPhoneNumber(), context)){
return R.string.contact_exists;
} else {
return R.string.adding_contact_failed;
}
}
在這種方法中,我嘗試瞭解聯繫人是否已經在我的地址簿中。因此,我查找電話號碼,因爲它應該在所有聯繫人中都是唯一的。
private boolean numberAlreadyInContacts(String number, Context context) {
if(number == null && number.length()<1){
return false;
}
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
ContentResolver contentResolver = context.getContentResolver();
Cursor contactLookup = contentResolver.query(uri, new String[] {BaseColumns._ID,
ContactsContract.PhoneLookup.DISPLAY_NAME }, null, null, null);
if (contactLookup != null && contactLookup.getCount() > 0) {
contactLookup.close();
return true;
}
contactLookup.close();
return false;
}
玩這段代碼!
Chris