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

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