代码之家  ›  专栏  ›  技术社区  ›  Nutriz

如何通过意向过滤器和操作接收多个vCard。发送多个

  •  1
  • Nutriz  · 技术社区  · 6 年前

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

    我已经用过 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>
    

    ShareActivity:

    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 而不是 动作发送多个 我只收到第一个选定的联系人。我的目标是接收Android联系人应用程序中选择的所有联系人。

    2 回复  |  直到 6 年前
        1
  •  1
  •   marmor    6 年前

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

    检查是否 handleSendContact 错误地假定vCard只包含一个联系人。

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

        2
  •  1
  •   Nutriz    6 年前

    短版:

    ACTION_SEND_MULTIPLE 从不用于联系人/vCard共享。相反, ACTION_SEND 总是与包含多个联系人的数据以及包含多个联系人的URI一起使用 LOOKUP_KEY 分开 : .


    长版本:

    共享联系人一:

    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
    

    共享联系人1+2:

    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 和这两个 查找关键字 分开 %3A (ASCII中的冒号)。我发现AOSP代码在 PeopleActivity.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
            }
        }
    }