如何通过 intent-filter 和 action.SEND_MULTIPLE 接收多个 vcard
How to receiving several vcard via intent-filter and action.SEND_MULTIPLE
我尝试通过 Android 联系人应用程序中的共享功能在我的应用程序中接收多个联系人,但我只收到第一个联系人,我从未收到 action
和 ACTION_SEND_MULTIPLE
.
我以 https://developer.android.com/training/sharing/receive 为灵感。
Android清单:
<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...
}
}
共享一个联系人,一切正常,但是当我 select 两个或更多联系人时,我收到的操作仍然是 ACTION_SEND
而不是 ACTION_SEND_MULTIPLE
我只收到第一个 selected联系方式。我的目标是在 Android 联系人应用程序 select 中接收所有联系人。
一个 VCard 文件可以包含一个或多个联系人,所以我假设发送应用程序正在为所有选定的联系人创建一个 VCard 文件,这解释了为什么 SEND
比 SEND_MULTIPLE
.
检查您的 handleSendContact
是否错误地假设 VCard 仅包含一个联系人。
您可以改为通过 Gmail 应用程序共享来检查正在发送的 VCard,然后将文件发送给自己,然后通过一些文本编辑器进行检查。它应按预期包含所有选定的联系人。
简短版本:
ACTION_SEND_MULTIPLE
永远不会与 Contacts/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
}
}
}
我尝试通过 Android 联系人应用程序中的共享功能在我的应用程序中接收多个联系人,但我只收到第一个联系人,我从未收到 action
和 ACTION_SEND_MULTIPLE
.
我以 https://developer.android.com/training/sharing/receive 为灵感。
Android清单:
<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...
}
}
共享一个联系人,一切正常,但是当我 select 两个或更多联系人时,我收到的操作仍然是 ACTION_SEND
而不是 ACTION_SEND_MULTIPLE
我只收到第一个 selected联系方式。我的目标是在 Android 联系人应用程序 select 中接收所有联系人。
一个 VCard 文件可以包含一个或多个联系人,所以我假设发送应用程序正在为所有选定的联系人创建一个 VCard 文件,这解释了为什么 SEND
比 SEND_MULTIPLE
.
检查您的 handleSendContact
是否错误地假设 VCard 仅包含一个联系人。
您可以改为通过 Gmail 应用程序共享来检查正在发送的 VCard,然后将文件发送给自己,然后通过一些文本编辑器进行检查。它应按预期包含所有选定的联系人。
简短版本:
ACTION_SEND_MULTIPLE
永远不会与 Contacts/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
}
}
}