При создании приложения важно учитывать, с какими другими приложениями на устройстве оно должно взаимодействовать. Если ваше приложение предназначено для Android 11 (API уровня 30) или более поздней версии, система делает некоторые приложения видимыми для вашего приложения автоматически, но по умолчанию отфильтровывает другие приложения. В этом руководстве рассказывается, как сделать другие приложения видимыми для вашего.
Если ваше приложение предназначено для Android 11 или более поздней версии и должно взаимодействовать с приложениями, которые не видны автоматически, добавьте элемент <queries> в файл манифеста. В элементе <queries> укажите другие приложения по названию пакета, по сигнатуре намерения или по поставщику, как описано в следующих разделах.
Названия пакетов
Если вы знаете, с какими приложениями хотите взаимодействовать или к каким хотите отправлять запросы (например, с теми, которые интегрированы с вашим приложением, или с теми, чьи сервисы вы используете), добавьте их названия пакетов в набор элементов <package> внутри элемента <queries>:
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
Как взаимодействовать с основным приложением в библиотеке
Если вы разрабатываете библиотеку Android, то можете объявить требования к видимости пакета, добавив элемент <queries> в файл манифеста AAR. Этот элемент <queries> имеет ту же функциональность, что и элемент, который приложения могут объявлять в своих манифестах.
Если библиотека взаимодействует с основным приложением, например использует привязанную службу, добавьте элемент <package>, в котором указано название пакета основного приложения:
<!-- Place inside the <queries> element. --> <package android:name=PACKAGE_NAME />
Добавив это объявление, вы сможете проверять, установлено ли основное приложение, и взаимодействовать с ним, например вызывать bindService().
В результате этого взаимодействия приложение для звонков, использующее вашу библиотеку, автоматически становится видимым для основного приложения.
Пакеты, соответствующие сигнатуре фильтра интентов
Вашему приложению может потребоваться запрашивать информацию у набора приложений, предназначенных для определенной цели, или взаимодействовать с ними, но вы можете не знать, какие именно названия пакетов нужно включить. В этом случае вы можете перечислить подписи фильтров интентов в элементе <queries>. После этого ваше приложение сможет находить приложения с совпадающими элементами <intent-filter>.
В примере кода ниже показан элемент <intent>, который позволяет приложению видеть другие установленные приложения, поддерживающие обмен изображениями в формате JPEG:
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
Для элемента <intent> действует несколько ограничений:
- Вам нужно добавить ровно один элемент
<action>. - Атрибуты
path,pathPrefix,pathPatternиportнельзя использовать в элементе<data>. Система будет работать так, как если бы вы установили для каждого атрибута значение подстановочного символа (*). - Нельзя использовать атрибут
mimeGroupэлемента<data>. В элементах
<data>одного элемента<intent>каждый из следующих атрибутов можно использовать не более одного раза:mimeTypeschemehost
Эти атрибуты можно распределить по нескольким элементам
<data>или использовать в одном элементе<data>.
Элемент <intent> поддерживает подстановочный знак (*) в качестве значения для нескольких атрибутов:
- Атрибут
nameэлемента<action>. - Подтип атрибута
mimeTypeэлемента<data>(image/*). - Тип и подтип атрибута
mimeTypeэлемента<data>(*/*). - Атрибут
schemeэлемента<data>. - Атрибут
hostэлемента<data>.
Если в предыдущем списке не указано иное, система не поддерживает сочетание текста и подстановочных знаков, например prefix*.
Пакеты, использующие определенный центр сертификации
Если вам нужно отправить запрос поставщику контента, но вы не знаете названия пакетов, объявите полномочия поставщика в элементе <provider>, как показано в следующем фрагменте кода:
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
Вы можете объявить полномочия поставщика в одном элементе <queries>. В элементе <queries> можно объявить один или несколько элементов <provider>. Элемент <provider> может содержать один или несколько поставщиков контента, разделенных точкой с запятой.
Все приложения (не рекомендуется)
В редких случаях приложению может потребоваться запросить информацию обо всех установленных на устройстве приложениях или взаимодействовать с ними независимо от того, какие компоненты они содержат. Чтобы ваше приложение могло видеть все остальные установленные приложения, система предоставляет разрешение QUERY_ALL_PACKAGES.
Вот несколько примеров, когда разрешение QUERY_ALL_PACKAGES может быть уместно:
- Приложения для доступа к специальным возможностям
- Браузеры
- Приложения для управления устройствами
- Приложения для обеспечения безопасности
- Антивирусы
Однако обычно для реализации сценариев использования приложения достаточно взаимодействовать с набором приложений, которые видны автоматически , и объявить в файле манифеста другие приложения, к которым вашему приложению нужен доступ. Чтобы не нарушать конфиденциальность пользователей, запрашивайте минимальный уровень видимости пакетов, необходимый для работы приложения.
В обновленных правилах Google Play приведены рекомендации для приложений, которым требуется разрешение QUERY_ALL_PACKAGES.