从Android API 23中的本机联系人应用程序启动我的应用程序

从Android API 23中的本机联系人应用程序启动我的应用程序,android,android-contacts,android-syncadapter,Android,Android Contacts,Android Syncadapter,我正在尝试将手机中的所有联系人与我的应用程序链接。然后从联系人应用程序启动我的应用程序。在api23中,联系人会被复制。所以请告诉我有没有人尝试过这个!!。。这是我试过的 public class ContactsSync extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { String n

我正在尝试将手机中的所有联系人与我的应用程序链接。然后从联系人应用程序启动我的应用程序。在api<23中,它工作正常。但是在api>23中,联系人会被复制。所以请告诉我有没有人尝试过这个!!。。这是我试过的

 public class ContactsSync extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        String name, number, id;
        for (int i = 0; i <=mIDs.size(); i++) {
            //name = mNames.get(i);
            id = mIDs.get(i);
            number = mNumbers.get(i);
            ContactsManager.addContact(Paymoney.this, new MyContact(id, number));
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        getContactDataAfter();
    }
}
公共类联系人同步扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串名称、编号、id;

对于(int i=0;i,您需要显式地将新的
RawContact
聚合为现有的(raw)联系人:


当然,在创建新的
RawContact

时,您可以使用
with valuebackreference
在同一批中运行此操作。显示
联系人管理器的代码。addContact
@marmor请查看withValueBackReference是否适用于api您是否为
某些现有的rawcontactId
使用了正确的值?您需要将其设置为现有原始联系人id,以便系统将这两个原始联系人合并为一个联系人
    ContentResolver resolver = context.getContentResolver();
    boolean mHasAccount = isAlreadyRegistered(resolver, contact.Id);

    if(mHasAccount){
    } else {

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

        // insert account name and account type
        ops.add(ContentProviderOperation
                .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.RawContacts.CONTENT_URI, true))
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, Constants.ACCOUNT_NAME)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, Constants.ACCOUNT_TYPE)
                .withValue(ContactsContract.RawContacts.AGGREGATION_MODE,
                        ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT)
                .build());

       ops.add(ContentProviderOperation
                .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true))
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(CommonDataKinds.Phone.NUMBER, contact.number)
                .build());


        ops.add(ContentProviderOperation
                .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true))
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, MIMETYPE)
                .withValue(ContactsContract.Data.DATA1, 12345)
                .withValue(ContactsContract.Data.DATA2, "user")
                .withValue(ContactsContract.Data.DATA3, "Send Money")
                .build());
            resolver.applyBatch(ContactsContract.AUTHORITY, ops);
ops.add(ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI)
   .withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER)
   .withValue(AggregationExceptions.RAW_CONTACT_ID1, yourNewRawContactId)
   .withValue(AggregationExceptions.RAW_CONTACT_ID2, someExistingRawContactId)
   .build());