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

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

    • 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 .