将联系人存储在文件中的电话联系人列表中



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

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"

代码中有什么问题?

我有相同的错误。您可以在我的方法中看到是什么在评论代码中引起的。您的错误必须相似。您的错误也可能是由于一些丢失的信息引起的。

但是,在尝试某事之前,请看看如果您用"(Phone.TYPE, Phone.TYPE_MOBILE)"更改"(Phone.TYPE ,type)"会发生什么。我认为这是您的错误,就像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);
    }
}

没有为此问题附加日志,因此它是一个尝试。

您的联系提供商(db)可能会支持" rawContacts.account_type"," rawContacts.account_name"列" null",但是在执行OnClick操作时,联系人详细信息需要该类型或名称的一些数据,不应应为null,所以它崩溃

因此,打开RAW_CONTACT表,并找到其他联系人的" Account_Type"one_answers" Account_Name"列的正确默认值。并在您的构建器操作中使用相同的值。

最新更新