Как показать и обработать контактную информацию намерений приложений?
Фон
Не знаю, как это называется, но когда вы открываете экран сведений о контактах в приложении контактов, вы видите там различные приложения, которые вы можете щелкнуть для выполнения действий (таких как вызов и отправка сообщений через 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
,
Например, 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: сообщение +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 );