Объявите требования к видимости пакета

При создании приложения важно учитывать другие приложения на устройстве, с которыми оно должно взаимодействовать. Если ваше приложение ориентировано на 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 .