При создании приложения важно учитывать другие приложения на устройстве, с которыми оно должно взаимодействовать. Если ваше приложение ориентировано на 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>. - В элементе
<data>нельзя использовать атрибутыpath,pathPrefix,pathPatternилиport. Система работает так, как если бы вы установили значение каждого атрибута в виде универсального символа подстановки (*). - Вы не можете использовать атрибут
mimeGroupэлемента<data>. Внутри элементов
<data>одного элемента<intent>можно использовать каждый из следующих атрибутов не более одного раза:-
mimeType -
scheme -
host
Эти атрибуты можно распределить между несколькими элементами
<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 .