gpt4 book ai didi

android - 如何显示和处理应用程序的联系方式 Intent ?

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:10 25 4
gpt4 key购买 nike

背景

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

enter image description here

问题

我不知道这些操作是如何调用的,所以我无法找到如何调查它们。我尝试搜索每个社交网络,了解如何使用它,但这似乎需要付出很多努力,而且将来可能效果不佳。

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

我尝试过的

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

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

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

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

问题

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

最佳答案

如果您从 ContactsContract.Data.CONTENT_URI 表中查询该联系人的所有信息,并将其转储到日志中,您将在 com.whatsapp< 等帐户中看到原始联系人com.viber,其数据行的 mimetypesvnd.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: Message +1 123-456-789
// other info ...

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

单击该操作时,您需要创建如下 Intent :

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 row-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,那么映射这些应用程序会更容易在您的应用中手动输入字段

关于android - 如何显示和处理应用程序的联系方式 Intent ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35992096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com