【问题标题】:Add app icon on Contact not working in Marshmallow在棉花糖中不起作用的联系人上添加应用程序图标
【发布时间】:2017-03-17 07:29:57
【问题描述】:

我正在电话簿中添加我的应用程序图标。现在的问题是它在 Api 级别 23 上工作不正常。

在 API 23 中,它会创建带有号码的新联系人。

在 Api 21 中

在 Api 23 中

String MIMETYPE = "vnd.android.cursor.item/com.appiconincontact";

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
                // insert account name and account type


                ops.add(
                        ContentProviderOperation
                                .newInsert(addCallerIsSyncAdapterParameter(RawContacts.CONTENT_URI, true))
                                .withValue(RawContacts.ACCOUNT_NAME, Constants.ACCOUNT_NAME)
                                .withValue(RawContacts.ACCOUNT_TYPE, Constants.ACCOUNT_TYPE)
                                .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT)
                                .build()
                );


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

                // insert mime-type data
                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.DATA2, Constants.APP_NAME)
                        .withValue(ContactsContract.Data.DATA3, "User Connected with " + number)
                        .build());

                try {
                    resolver.applyBatch(ContactsContract.AUTHORITY, ops);
                } catch (Exception e) {
                    e.printStackTrace();
                }

【问题讨论】:

    标签: android android-6.0-marshmallow android-contacts


    【解决方案1】:

    您正在创建一个新 RawContact,并希望系统将其聚合到现有的Contact。

    您缺少“请将此新的原始联系人附加到此现有联系人”部分。

    为此,您需要添加AggregationExceptions。

    首先,在您希望添加到的Contact 中找到当前的RawContact IDs,然后在AggregationExceptions 中添加一行链接新的RawContact._ID (raw1) 和现有的RawContact._ID ( raw2)

    Builder builder = ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI);
    builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);
    builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, raw1);
    builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, raw2);
    ops.add(builder.build());
    

    编辑

    如果您想将此代码添加到现有批次中:

    ArrayList<ContentProviderOperation> ops = new ArrayList<>();
    // insert account name and account type
    ops.add(ContentProviderOperation.newInsert( ... ).build());
    // insert contact number
    ops.add(ContentProviderOperation.newInsert( ... ).build());
    // insert mime-type data
    ops.add(ContentProviderOperation.newInsert( ... ).build());
    
    // add an AggregationExceptions line 
    ops.add(ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI)
        .withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER)
        .withValueBackReference(AggregationExceptions.RAW_CONTACT_ID1, 0)
        .withValue(AggregationExceptions.RAW_CONTACT_ID2, theRawContactIdOfTheExistingContact)
        .build());
    
    try {
       resolver.applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) { ... }
    

    这里你唯一需要填写的是theRawContactIdOfTheExistingContact,注意它不是一个contact-id,它是一个raw-contact-id,你'您需要在此处输入正确的值,具体取决于您的代码的其余部分,以及您如何找到要添加数据的联系人。

    【讨论】:

    • 添加的代码显示此操作如何适合您现有的批处理
    • 我正在创建 raw-contact_id 使用此链接 stackoverflow.com/questions/19675279/… 但不工作
    • 嗨,感谢您的解决方案,但现在我面临另一个问题:我无法从 android 联系人列表中的自定义 raw 打开我的应用程序。我需要在意图过滤器中提及什么?
    • @AndiM 这取决于您在自定义 mimetype 数据行中添加的内容。单击联系人中的该行时,您可以检查 logcat 的标签“ActivityManager”,以查看它发送的确切意图,因此您可以相应地更改意图过滤器。
    • @marmor 当我点击我的自定义行时,我找不到任何日志。它只向我展示了一个带有消息“没有找到处理此操作的应用程序”的祝酒词。能否请您展示一些代码 sn-p 来实现这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多