通过文件在Android中的电话联系人列表中存储联系人

时间:2012-10-30 09:41:26

标签: android android-contacts

我正在使用此代码将联系人从文件存储到手机的联系人列表中:

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"

代码中有什么问题?

2 个答案:

答案 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”列的正确默认值。并在构建器操作中使用相同的值。