如何显示和处理应用程序的联系详细信息意图?

and*_*per 5 android android-intent android-contacts

背景

不确定如何调用,但是当您打开联系人应用程序的“联系人详细信息”屏幕时,您会看到在那里可以单击以执行操作的各种应用程序(例如通过Viber和WhatsApp调用和发送消息),如下所示:

在此处输入图片说明

问题

我不知道这些动作的调用方式,所以我不知道如何进行调查。我尝试搜索每个社交网络以及如何使用它,但是这似乎需要很多努力,甚至在将来可能无法正常工作。

我希望针对本机联系人应用程序上显示的所有应用程序查询这些动作,显示它们并进行处理。

我尝试过的

我试图调查正在使用的意图,发现对于Viber,这可以用于消息:

    intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://com.android.contacts/data/"+id));
    intent.setPackage("com.viber.voip");
Run Code Online (Sandbox Code Playgroud)

但是,我不知道这个“ id”是什么,仅是因为我已经用真实数据测试过它了。我还尝试实际打印所有联系人数据库,以找到要使用的正确值(和映射),但是我没有找到它。

另外,我找不到应该如何找到此信息。我的猜测是,它可能应该包括一个可用的模仿类型的查询,并在指定的联系人上检查它们(可能使用联系人ID)。

问题

给定联系人(ID或电话号码)后,如何显示和执行联系人应用程序的“联系人详细信息”屏幕上所示的操作?

mar*_*mor 0

如果您从表中查询该联系人的所有信息,并将其转储到日志,您将在类似或 的ContactsContract.Data.CONTENT_URI帐户中看到原始联系人,其中的数据行以 开头。com.whatsappcom.vibermimetypesvnd.android.cursor.item

例如,Whatsapp Data一行可能如下所示:

_id:247
account_type:com.whatsapp
mimetype:vnd.android.cursor.item/vnd.com.whatsapp.profile
display_name:Bob
raw_contact_id:62
data1:1123456789@s.whatsapp.net
data2:WhatsApp
data3:消息+1 123- 456-789
// 其他信息...

因此,当您的代码看到此类Data行时,它应该向用户显示应用程序的应用程序图标com.whatsapp( account_type) 和文本Message +1 123-456-789( data3),您还可以显示其他信息,例如应用程序名称Whatsapp( data2)。

单击该操作时,您需要创建一个如下所示的意图:

Uri uri = ContentUris.withAppendedId(Data.CONTENT_URI, 247);
Intent i = new Intent(Intent.ACTION_VIEW, uri);
i.setType("vnd.android.cursor.item/vnd.com.whatsapp.profile");
Run Code Online (Sandbox Code Playgroud)

应用程序应该有一个Activity注册到该 mimetype 的对象,它将查询Data.CONTENT_URI表中的247row-id,从中获取配置文件 iddata1并执行请求的操作。

特定字段(其中一个是可见文本等)是在ContactsDataKind应用程序中的对象中定义的,但外部应用程序并不容易读取它,但根据我的经验,大多数此类应用程序使用相同的字段来执行相同的行为(例如data3是用户显示的操作文本)

PS
要获取不属于您的应用程序的资源,您可以使用以下命令:

Drawable icon = getPackageManager().getApplicationIcon( PACKAGE_NAME );
Run Code Online (Sandbox Code Playgroud)

编辑

每个同步联系人并希望通过联系人应用程序呈现应用程序特定操作的应用程序都需要在该应用程序下创建一个contacts.xml 文件,res/xml/contacts.xml该文件需要可通过(或其他方式)访问getPackageManager(),以便联系人呈现应用程序能够读取它并识别应用程序的特定 MIMETYPES 和字段映射。

例如,Whatsapp contact.xml 如下所示:

<ContactsSource
  xmlns:android="http://schemas.android.com/apk/res/android">
    <ContactsDataKind android:icon="@mipmap/icon" android:mimeType="vnd.android.cursor.item/vnd.com.whatsapp.profile" android:summaryColumn="data2" android:detailColumn="data3" android:detailSocialSummary="true" />
    <ContactsDataKind android:icon="@mipmap/icon" android:mimeType="vnd.android.cursor.item/vnd.com.whatsapp.voip.call" android:summaryColumn="data2" android:detailColumn="data3" />
    <ContactsDataKind android:icon="@mipmap/icon" android:mimeType="vnd.android.cursor.item/vnd.com.whatsapp.video.call" android:summaryColumn="data2" android:detailColumn="data3" />
</ContactsSource>
Run Code Online (Sandbox Code Playgroud)

Google Duo Contacts.xml 文件是:

<ContactsAccountType
  xmlns:android="http://schemas.android.com/apk/res/android">
    <ContactsDataKind android:icon="@drawable/product_logo_duo_color_48" android:mimeType="vnd.android.cursor.item/com.google.android.apps.tachyon.phone" android:summaryColumn="data4" android:detailColumn="data5" android:detailSocialSummary="true" />
    <ContactsDataKind android:icon="@drawable/duo_audio_icon_vector" android:mimeType="vnd.android.cursor.item/com.google.android.apps.tachyon.phone.audio" android:summaryColumn="data4" android:detailColumn="data5" android:detailSocialSummary="true" />
</ContactsAccountType>
Run Code Online (Sandbox Code Playgroud)

请参阅此处的官方文档:https ://developer.android.com/guide/topics/providers/contacts-provider#ContactsFile

但是,如果您不打算支持世界上的每个应用程序,而只是支持一些精心挑选的应用程序列表,例如 Whatsapp / Duo,那么在您的应用程序中手动映射这些字段会更容易