Как показать и обработать контактную информацию намерений приложений?

Фон

Не знаю, как это называется, но когда вы открываете экран сведений о контактах в приложении контактов, вы видите там различные приложения, которые вы можете щелкнуть для выполнения действий (таких как вызов и отправка сообщений через Viber и WhatsApp) следующим образом:

введите описание изображения здесь

Эта проблема

Я не знаю, как эти действия называются, поэтому я не могу узнать, как их расследовать. Я пытался найти каждую социальную сеть, как ее использовать, но это кажется большим усилием, которое может не сработать в будущем.

Я хочу запросить эти действия, показать их и обработать их для всех приложений, которые отображаются в собственном приложении контактов.

Что я пробовал

Я попытался выяснить, какие намерения используются, и обнаружил, что для Viber это то, что можно использовать для сообщений:

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

Однако я не знаю, что это за "идентификатор", только потому, что он работает, потому что я проверил его на реальных данных. Я также попытался распечатать всю базу данных контактов, чтобы найти правильное значение (и сопоставление), но я не нашел его.

Кроме того, я не могу найти, как эта информация должна была быть найдена. Я предполагаю, что он, вероятно, должен включать в себя запрос доступных типов MIME и проверить их на указанном контакте (возможно, с использованием идентификатора контакта).

Вопрос

Если у вас есть контакт (идентификатор или номер телефона), как я могу показать и выполнить операцию, как показано на экране сведений о контактах в приложении контактов?

1 ответ

Если вы запрашиваете всю информацию этого контакта из ContactsContract.Data.CONTENT_URI таблицу, и дамп его в журнал, вы увидите raw-контакты в учетных записях, как com.whatsapp или же com.viber, которые имеют строки данных с mimetypes которые начинаются с vnd.android.cursor.item,

Например, WhatsappData строка может выглядеть так:

_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: сообщение +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");

Приложение должно иметь Activity который зарегистрирован на этот тип MIME, который будет запрашивать Data.CONTENT_URI стол для 247 row-id, получить идентификатор профиля из data1 и выполните требуемое действие.

Конкретные поля (из которых видимый текст и т. Д.) Определены в ContactsDataKind объект в приложении, но это не так легко читается внешними приложениями, но по моему опыту большинство таких приложений используют одни и те же поля для одинакового поведения (например, data3 пользователь отображает текст действия)

PS
Чтобы получить ресурс приложения, которое вам не принадлежит, вы можете использовать это:

Drawable icon = getPackageManager().getApplicationIcon( PACKAGE_NAME );
Другие вопросы по тегам