【问题标题】:How to receiving several vcard via intent-filter and action.SEND_MULTIPLE如何通过 intent-filter 和 action.SEND_MULTIPLE 接收多个 vcard
【发布时间】:2019-06-04 10:59:57
【问题描述】:

我尝试通过 Android 联系人应用程序中的共享功能在我的应用程序中接收多个联系人,但我只收到第一个联系人,我从未收到 actionACTION_SEND_MULTIPLE

我以https://developer.android.com/training/sharing/receive 为灵感。

AndroidManifest:

<activity android:name=".ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/x-vcard" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/x-vcard" />
    </intent-filter>
</activity>

分享活动:

Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();

if (Intent.ACTION_SEND.equals(action) && type != null) {
    // My code always pass here because action is always equals to ACTION_SEND even with several contacts selectionned
    if ("text/x-vcard".equals(type)) {
        handleSendContact(intent);
    }
} else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
    if ("text/x-vcard".equals(type)) {
        handleSendMultiContact(intent);
    }
}

private void handleSendContact(Intent intent) {
    Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
    // use uri to get lookupkey...
}

private void handleSendMultiContact(Intent intent) {
    ArrayList<Uri> contactUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    for (Uri uri : contactUris) {
        // use uri to get lookupkey...
    }
}

共享一个联系人,一切正常,但是当我选择两个或多个联系人时,我收到的操作仍然是ACTION_SEND 而不是ACTION_SEND_MULTIPLE,我只收到第一个选择的联系人。我的目标是接收在 Android 联系人应用程序中选择的所有联系人。

【问题讨论】:

    标签: android android-intent android-contacts intentfilter vcf-vcard


    【解决方案1】:

    短版:

    ACTION_SEND_MULTIPLE 从不与联系人/vCard 共享一起使用。相反,ACTION_SEND 始终用于包含多个联系人的数据和包含多个 LOOKUP_KEY 的 uri,由 : 分隔。


    长版:

    分享联系人一:

    content://com.android.contacts/contacts/as_multi_vcard/2345r1817-373F294D4F4329413151472F294F312F
    
    BEGIN:VCARD
    VERSION:2.1
    N:NAME_1;
    TEL;WORK:039-999-9999
    EMAIL;HOME:updated@home.fr
    URL:www.home_updated.fr
    END:VCARD
    

    分享联系人二:

    content://com.android.contacts/contacts/as_multi_vcard/2345r1820-4D553943354B2F514F4D553943354B2F514F
    
    BEGIN:VCARD
    VERSION:2.1
    N:NAME_2;
    TEL;WORK:039-999-9999
    EMAIL;HOME:updated@home.fr
    URL:www.home_updated.fr
    END:VCARD
    

    分享联系人一+二:

    content://com.android.contacts/contacts/as_multi_vcard/2345r1817-373F294D4F4329413151472F294F312F%3A2345r1820-4D553943354B2F514F4D553943354B2F514F
    
    BEGIN:VCARD
    VERSION:2.1
    N:NAME_1;
    TEL;WORK:039-999-9999
    EMAIL;HOME:updated@home.fr
    URL:www.home_updated.fr
    END:VCARD
    BEGIN:VCARD
    VERSION:2.1
    N:NAME_2;
    TEL;WORK:039-999-9999
    EMAIL;HOME:updated@home.fr
    URL:www.home_updated.fr
    END:VCARD
    

    正如您在上面所看到的,共享两个联系人会导致Uri 上的两个LOOKUP_KEY%3A(ASCII 中的冒号)分隔。我在 PeopleActivity.java 中找到了执行此操作的 aosp 代码以了解详细信息。

    所以我可以利用这段代码共享多个联系人:

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        Log.d("type", "type: " + type);
        if (type.equals("text/x-vcard")) {
            handleSendContact(intent);
        }
    }
    
    void handleSendContact(Intent intent) {
        Uri contactUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
        if (contactUri != null) {
            //  getLastPathSegment() decodes "%3A" to ":", so split must be done on colon
            String[] lookupKeys = contactUri.getLastPathSegment().split(":");
            for (String lookupKey : lookupKeys) {
                // Query contact with lookup key
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      单个 VCard 文件可以包含一个或多个联系人,因此我假设发送应用正在为所有选定的联系人创建一个 VCard 文件,这解释了为什么 SENDSEND_MULTIPLE 更合适。

      检查您的handleSendContact 是否错误地假定 VCard 仅包含一个联系人。

      您可以改为通过 Gmail 应用程序共享来检查正在发送的 VCard,然后将文件发送给自己,并通过一些文本编辑器进行检查。它应该按预期包含所有选定的联系人。

      【讨论】:

      • 感谢您的回答,是的,您是对的(如果选择了多个联系人,则 vcard 包含多个联系人),问题是我需要为每个联系人设置一个查找键来查询联系人数据库(vcard 的数据还不够)。
      猜你喜欢
      • 2021-06-30
      • 2018-04-06
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2017-11-01
      • 1970-01-01
      相关资源
      最近更新 更多