如果您从ContactsContract.Data.CONTENT_URI 表中查询该联系人的所有信息并将其转储到日志中,您将在com.whatsapp 或com.viber 等帐户中看到原始联系人,这些帐户的数据行带有mimetypes以vnd.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,那么映射这些应用程序会更容易在您的应用中手动输入字段