我正在使用此代码将联系人从文件存储到手机的联系人列表中:
public void addContacts(String name, String number, String type) {
int backRefIndex = 0;
String data=name+"--"+number+"--"+type;
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
Toast.makeText(getApplicationContext(), data, Toast.LENGTH_LONG).show();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex)
.withValue(ContactsContract.Data.MIMETYPE
,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
.build());
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, backRefIndex)
.withValue(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, number)
.withValue(Phone.TYPE, type).build());
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) { }
}
它正在运行,没有任何错误。但是,当从手机的联系人列表中查看添加的联系人时,会显示一条错误消息"Unfortunately contacts have stopped working"
。
代码中有什么问题?
答案 0 :(得分:0)
我有同样的错误。您可以在我的方法中查看注释代码中的原因。你的错误必须类似。您的错误也可能是由于某些缺失信息引起的。
但在尝试之前,如果您使用"(Phone.TYPE ,type)"
更改"(Phone.TYPE, Phone.TYPE_MOBILE)"
,将会发生什么。我认为这是Sumit Chawla在评论中所说的错误。
添加空值检查是一种很好的做法。他们可以抛出异常。
public void addContacts(String name, String number, int numberType
, String email, String organization, String street, String city
, String region, String postcode) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.build());
ops.add(ContentProviderOperation
.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID,rawContactInsertIndex)
.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.DISPLAY_NAME, name)
.build());
ops.add(ContentProviderOperation
.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, number)
.withValue(Phone.TYPE, numberType)
//.withValue(Phone.TYPE, Phone.TYPE_MOBILE) //Use constants for type
.build());
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, 0)
.withValue(Data.MIMETYPE,Email.CONTENT_ITEM_TYPE)
.withValue(Email.DATA, email)
//If I add Email.TYPE People(Phone's contacts application)
//doesn't work any more.
//The error is: "Unfortunately contacts have stopped working"
// .withValue(Email.TYPE,Email.TYPE_MOBILE)
.build());
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, 0)
.withValue(Data.MIMETYPE,Organization.CONTENT_ITEM_TYPE)
.withValue(Organization.COMPANY, organization)
.build());
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, 0)
.withValue(Data.MIMETYPE,StructuredPostal.CONTENT_ITEM_TYPE)
.withValue(StructuredPostal.STREET, street)
.withValue(StructuredPostal.CITY, city)
.withValue(StructuredPostal.REGION, region)
.withValue(StructuredPostal.POSTCODE, postcode)
.build());
try {
mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
Log.e(TAG, "Error adding contact!", e);
}
}
答案 1 :(得分:0)
此问题没有附加日志所以这是尝试。
您的联系提供商(db)可能支持“RawContacts.ACCOUNT_TYPE”,“RawContacts.ACCOUNT_NAME”列为NULL,但在执行Onclick操作时,联系人详细信息视图需要该类型或名称的某些数据不应该为空,所以它崩溃了
打开raw_contact表,找到其他联系人的“ACCOUNT_TYPE”和“ACCOUNT_NAME”列的正确默认值。并在构建器操作中使用相同的值。