If you query for all that contact's info from the ContactsContract.Data.CONTENT_URI
table, and dump it to log, you'll see raw-contacts in accounts like com.whatsapp
or com.viber
, that have data rows with mimetypes
that begin with vnd.android.cursor.item
.
For example a Whatsapp
Data
row might look like this:
_id: 247
account_type: com.whatsapp
mimetype: vnd.android.cursor.item/vnd.com.whatsapp.profile
display_name: Bob
raw_contact_id: 62
data1: [email protected]
data2: WhatsApp
data3: Message +1 123-456-789
// other info ...
So when your code sees such Data
rows, it should display to the user the app icon of the app com.whatsapp
(account_type
) with the text Message +1 123-456-789
(data3
) and you can also display other info like app name Whatsapp
(data2
).
When that action is clicked, you need to create an intent like this:
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");
The app should have an Activity
that registered to that mimetype, that will query the Data.CONTENT_URI
table for the 247
row-id, get the profile id from data1
and perform the action requested.
The specific fields (which one is the visible text, etc.) are defined in a ContactsDataKind
object in the app, but it's not that easily read by external apps, but in my experience most such apps use the same fields for the same behavior (e.g. data3
is the user displayed action text)
P.S.
To get the resource of an app that is not yours, you can use this:
Drawable icon = getPackageManager().getApplicationIcon( PACKAGE_NAME );
EDIT
Each app that syncs contacts and wish to be presented by Contacts apps with app-specific actions will need to create a contacts.xml file under res/xml/contacts.xml
that app needs to be accessible via getPackageManager()
(or other means) so the contact presenting app will be able to read it and recognize the app's specific MIMETYPES and field mappings.
For example, Whatsapp contacts.xml looks like this:
<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>
And Google Duo contacts.xml file is:
<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>
See official docs here: https://developer.android.com/guide/topics/providers/contacts-provider#ContactsFile
However, if you're not planning on supporting EVERY single app in the world, rather just some hand-picked list of apps like Whatsapp / Duo, it would be way easier just to map those fields manually in your app