Как получить несколько vcard через intent-filter и action.SEND_MULTIPLE - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь получить более одного контакта в своем приложении из функции общего доступа в приложении контактов Android, но я получаю только первый контакт, я никогда не получаю action с ACTION_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>

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, а не ACTION_SEND_MULTIPLE, и я получаю только первый выбранный контакт. Моя цель - получить все контакты, выбранные в приложении контактов Android.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Короткая версия:

ACTION_SEND_MULTIPLE никогда не используется при совместном использовании контактов / визитных карточек. Вместо этого ACTION_SEND всегда используется с данными, содержащими несколько контактов, а URI, содержащий multi 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

Совместное использование контактов один + два:

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). Я нашел код 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
        }
    }
}
0 голосов
/ 13 января 2019

Один файл VCard может содержать один или несколько контактов, поэтому я предполагаю, что отправляющее приложение создает один файл VCard для всех выбранных контактов, что объясняет, почему SEND более подходит, чем SEND_MULTIPLE.

Проверьте, ошибочно ли ваша handleSendContact предполагает, что VCard содержит только один контакт.

Вы можете проверить отправляемую VCard, поделившись ею с помощью приложения Gmail, и отправить файл себе и проверить его в каком-либо текстовом редакторе. Он должен содержать все выбранные контакты, как и ожидалось.

...