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

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