Android 根据电话号码添加原始联系人时联系人重复

Android 根据电话号码添加原始联系人时联系人重复,android,android-contentprovider,rawcontacts,Android,Android Contentprovider,Rawcontacts,我正在尝试为Android联系人列表中与所有联系人关联的每个电话号码添加原始联系人。当某些联系人有多个相关电话号码时,android联系人列表会多次显示同一联系人。我想聚合那些新添加的原始联系人(基于电话号码)并在该联系人下显示 private static void addContact(Account account, ClsContactList ObjContact) { ArrayList<ContentProviderOperation> operationLis

我正在尝试为Android联系人列表中与所有联系人关联的每个电话号码添加原始联系人。当某些联系人有多个相关电话号码时,android联系人列表会多次显示同一联系人。我想聚合那些新添加的原始联系人(基于电话号码)并在该联系人下显示

private static void addContact(Account account, ClsContactList ObjContact) {
    ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
    int rawContactInsertIndex = operationList.size();
    for (String phoneNumber : ObjContact.PhoneNumbers) {
        operationList.clear();
        //Creating raw contact
        ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
        builder.withValue(RawContacts.ACCOUNT_NAME, account.name);
        builder.withValue(RawContacts.ACCOUNT_TYPE, account.type);
        builder.withValue(ContactsContract.RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT);
        //builder.withValue(RawContacts.SYNC1, ObjContact.getDisplay_name());
        operationList.add(builder.build());
        //INSERT NAME
        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
        builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, ObjContact.getDisplay_name());
        operationList.add(builder.build());

        //INSERT MOBILE
        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber); // Number of the person
        //builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
        operationList.add(builder.build());

        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.org.c99.SyncProviderDemo.profile");
        builder.withValue(ContactsContract.Data.DATA1, "VOIP Call ("+phoneNumber+")");
        builder.withValue(ContactsContract.Data.DATA2, "Dialer App");
        builder.withYieldAllowed(true);
        operationList.add(builder.build());
        try {
            mContentResolver.applyBatch(ContactsContract.AUTHORITY, operationList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}  
我所做的是,我使用下面的URI
contacts contacts.contacts.CONTENT\u URI

使用
URI

ContactsContract.CommonDataKinds.Phone.CONTENT_URI
然后为每个联系人创建ClsContactList
类对象
,其中包含联系人的显示名称和与该联系人关联的电话号码数组。最后,将这些对象添加到列表中,并为列表中的每个对象调用附加函数来创建原始联系人

private static void addContact(Account account, ClsContactList ObjContact) {
    ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
    int rawContactInsertIndex = operationList.size();
    for (String phoneNumber : ObjContact.PhoneNumbers) {
        operationList.clear();
        //Creating raw contact
        ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
        builder.withValue(RawContacts.ACCOUNT_NAME, account.name);
        builder.withValue(RawContacts.ACCOUNT_TYPE, account.type);
        builder.withValue(ContactsContract.RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT);
        //builder.withValue(RawContacts.SYNC1, ObjContact.getDisplay_name());
        operationList.add(builder.build());
        //INSERT NAME
        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
        builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, ObjContact.getDisplay_name());
        operationList.add(builder.build());

        //INSERT MOBILE
        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber); // Number of the person
        //builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
        operationList.add(builder.build());

        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.org.c99.SyncProviderDemo.profile");
        builder.withValue(ContactsContract.Data.DATA1, "VOIP Call ("+phoneNumber+")");
        builder.withValue(ContactsContract.Data.DATA2, "Dialer App");
        builder.withYieldAllowed(true);
        operationList.add(builder.build());
        try {
            mContentResolver.applyBatch(ContactsContract.AUTHORITY, operationList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}  
private static void addContact(Account Account,clscontctlist ObjContact){
ArrayList operationList=新建ArrayList();
int rawContactInsertIndex=operationList.size();
for(字符串电话号码:ObjContact.PhoneNumbers){
operationList.clear();
//创建原始联系人
ContentProviderOperation.Builder=ContentProviderOperation.newInsert(RawContacts.CONTENT\u URI);
builder.withValue(rawscontacts.ACCOUNT\u NAME,ACCOUNT.NAME);
builder.withValue(rawscontacts.ACCOUNT\u类型,ACCOUNT.TYPE);
builder.withValue(contacts contract.RawContacts.AGGREGATION\u MODE,RawContacts.AGGREGATION\u MODE\u DEFAULT);
//withValue(RawContacts.SYNC1,ObjContact.getDisplay_name());
add(builder.build());
//插入名称
builder=ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\u URI);
带ValueBackReference的生成器(contacts contract.Data.RAW\u CONTACT\u ID,RAW contacts insertindex);
builder.withValue(contacts contract.Data.MIMETYPE、contacts contract.commondatatypes.StructuredName.CONTENT\u ITEM\u TYPE);
builder.withValue(ContactsContract.CommonDataTypes.StructuredName.DISPLAY_NAME,ObjContact.getDisplay_NAME());
add(builder.build());
//插入手机
builder=ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\u URI);
带ValueBackReference的生成器(contacts contract.Data.RAW\u CONTACT\u ID,RAW contacts insertindex);
builder.withValue(contacts contract.Data.MIMETYPE、contacts contract.commondatatypes.Phone.CONTENT\u ITEM\u TYPE);
builder.withValue(ContactsContract.CommonDataTypes.Phone.NUMBER,phoneNumber);//人员编号
//builder.withValue(contacts contract.commondatatypes.Phone.TYPE,contacts contract.commondatatypes.Phone.TYPE\u MOBILE);
add(builder.build());
builder=ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\u URI);
带ValueBackReference的生成器(contacts contract.Data.RAW\u CONTACT\u ID,RAW contacts insertindex);
withValue(ContactsContract.Data.MIMETYPE,“vnd.android.cursor.item/vnd.org.c99.SyncProviderDemo.profile”);
builder.withValue(contacts contract.Data.DATA1,“VOIP呼叫(“+phoneNumber+”);
builder.withValue(contacts contract.Data.DATA2,“拨号应用程序”);
建筑商。允许使用产量(真);
add(builder.build());
试一试{
mContentResolver.applyBatch(contacts contract.AUTHORITY,operationList);
}捕获(例外e){
e、 printStackTrace();
}
}
}  
请看附带的屏幕截图。非常感谢

联系人详细信息活动中的原始联系人

联系人在Android联系人列表中重复


您需要像这样进行查询,通过比较mime类型来获得过滤后的数据

contacts contract.Data.MIMETYPE
=
StructuredPostal.CONTENT\u ITEM\u TYPE

Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
     null, null, ContacsContract.Data.MIMETYPE +  "='" + 
ContactsContract.StructuredPostal.CONTENT_ITEM_TYPE + "'", null);

谢谢你的回复。在我的例子中,问题是在添加原始联系人时重复了联系人。在所附的屏幕截图中,名为“aaaaa”的联系人重复,因为它有两个电话号码。在这里,我试图为每个与“AAAAA”关联的电话号码添加原始联系人。