如何通过意图过滤器和操作接收多个电子名片.SEND_MULTIPLE



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

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

安卓清单 :

<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联系人应用程序中选择的所有联系人。

简短版本:

ACTION_SEND_MULTIPLE永远不会与通讯录/电子名片共享一起使用。相反,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中找到了aosp代码.java以获取详细信息。

因此,我可以使用该代码块利用多个联系人共享:

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
        }
    }
}
单个

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

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

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

最新更新