WhatsApp和大多数集成到Android核心组件(如联系人)中的应用程序使用基于MIME类型的意图来启动应用程序中的某个活动。 WhatsApp使用3种不同的MIME类型 - 文本消息(vnd.android.cursor.item/vnd.com.whatsapp.profile),VoIP呼叫(vnd.android.cursor.item/vnd.com.whatsapp.voip.call)和视频呼叫(vnd.android.cursor.item/vnd.com.whatsapp.video.call)。对于这些MIME类型中的每一个,应用程序清单中都映射了一个单独的活动。例如:MIME类型(...whatsapp.profile)映射到一个活动(com.whatsapp.Conversation)。如果您转储与您的联系人数据库中的任何WhatsApp Raw_Contact相对应的所有数据行,您可以详细查看这些内容。
这也是Android联系人应用程序在“WhatsApp联系人”内显示3个单独的用户操作行的方式,单击其中任何一个行将启动WhatsApp内的单独功能。
要在WhatsApp中为特定联系人启动“Conversation(聊天)”活动,您需要触发包含MIME_TYPE和DATA_URL的意图。 MIME类型指向WhatsApp在联系人数据库中定义的与您的操作相对应的MIME类型。 DATA_URL是Android联系人数据库中Raw_Contact的URI。
String whatsAppMimeType = Uri.parse("vnd.android.cursor.item").buildUpon()
.appendEncodedPath("vnd.com.whatsapp.profile").build().toString();
Uri uri = ContactsContract.RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, "com.whatsapp")
.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, "WhatsApp")
.build();
Cursor cursor = getContentResolver().query(uri, null, null, null);
if (cursor==null || cursor.getCount()==0) continue;
cursor.moveToNext();
int rawContactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.RawContacts._ID));
cursor.close();
Cursor dataCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.Data.MIMETYPE + "=? AND " + ContactsContract.Data.RAW_CONTACT_ID + "=?",
new String[]{whatsAppMimeType, String.valueOf(rawContactId)}, null);
if (dataCursor==null || dataCursor.getCount()==0) continue;
dataCursor.moveToNext();
int dataRowId = dataCursor.getInt(dataCursor.getColumnIndex(ContactsContract.Data._ID));
Uri userRowUri = ContactsContract.Data.CONTENT_URI.buildUpon()
.appendPath(String.valueOf(dataRowId)).build();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(userRowUri, whatsAppMimeType);
startActivity(intent);
dataCursor.close();
这是所有联系人应用程序使用的相同方式,用于启动与Whatsapp联系人的聊天活动。在此活动中,应用程序(Whatsapp)通过.getData()读取传递给此活动的DATA_URI。Android联系人应用程序使用标准机制在Whatsapp中使用原始联系人的URI。不幸的是,我不知道.Whatsapp中的.Conversation活动如何从意图的调用者中读取任何文本/数据信息。这基本上意味着可以使用非常标准的技术在Whatsapp内启动某个“用户操作”。或者说,任何类似的应用程序。