如何显示和处理应用程序的联系方式意图?

Posted

技术标签:

【中文标题】如何显示和处理应用程序的联系方式意图?【英文标题】:How to show&handle contact details intents of apps? 【发布时间】:2016-06-29 18:14:57 【问题描述】:

背景

不确定它是如何调用的,但是当您打开联系人应用程序的联系人详细信息屏幕时,您会在其中看到各种应用程序,您可以单击这些应用程序来执行操作(例如通过 Viber 和 WhatsApp 呼叫和发送消息),例如:

问题

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

我希望查询这些操作,显示它们并处理它们,用于本地联系人应用程序上显示的所有应用程序。

我尝试过的

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

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

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

另外,我找不到应该如何找到这些信息。我的猜测是它可能应该包含对可用 mimetypes 的查询,并在指定的联系人上检查它们(可能使用联系人 ID)。

问题

给定一个联系人(id 或电话号码),我如何显示和执行联系人应用程序的联系人详细信息屏幕上显示的操作?

【问题讨论】:

请检查***.com/questions/26999096/…和***.com/questions/17066444/… @Blehi 这与我所说的相反。我想根据联系人数据已有的内容创建视图:viber、Whatsapp 等...例如,如果您创建一个联系人应用程序,您应该在那里显示它。我不想创建新的。 撞了这个并悬赏它。希望看到一个通用的解决方案。 我不确定您要做什么...您要显示联系人列表并根据安装的应用程序显示不同的操作吗? @Yoker 如果你能找到创建数据的应用程序,你可以得到它的图标。但是获取我在屏幕截图上显示的项目及其意图的查询是什么?你从哪里得到字符串“WhatsApp Call”、“Message”? 【参考方案1】:

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

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

_id:247 account_type: com.whatsapp mimetype:vnd.android.cursor.item/vnd.com.whatsapp.profile 显示名称:鲍勃 raw_contact_id:62 数据1:1123456789@s.whatsapp.net 数据 2: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");

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

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

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

Drawable icon = getPackageManager().getApplicationIcon( PACKAGE_NAME );

编辑

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

例如,Whatsapp contacts.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>

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>

在此处查看官方文档:https://developer.android.com/guide/topics/providers/contacts-provider#ContactsFile

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

【讨论】:

@yoker 当你运行意图时会发生什么?你看到 WhatsApp 应用程序打开了吗?您是否收到“未找到处理此意图的活动”? 我如何知道该图标使用哪个应用程序?应用程序不能放在那里(在 "account_type" 中)他们想要的任何东西吗? 我还没有看到 account_type 不是包名的情况,你有没有例子说明? 意图的东西代码不起作用。请在发布之前运行您自己的代码。另外 - 包管理器图标与问题中描述的图标不同。正如您在问题中看到的那样,viber 图标对于所有不同的操作都是不同的。 “WhatsApp 通话”从何而来?

以上是关于如何显示和处理应用程序的联系方式意图?的主要内容,如果未能解决你的问题,请参考以下文章

从联系人意图添加联系人后如何刷新列表视图?

如何从联系人中获取电子邮件和姓氏?

如何使用意图和活动在 Xamarin Android 中插入城市、街道、邮政编码、国家/地区的联系人?

如何在创建后通过更改活动来处理推送通知意图?

未调用 SiriKit 意图处理程序

诗丽吉意图处理