Ao criar o app, é importante considerar os outros apps no dispositivo com que o app precisa interagir. Se o app for direcionado ao Android 11 (API de nível 30) ou versões mais recentes, o sistema vai deixar alguns apps visíveis automaticamente para o seu, mas vai ocultar outros por padrão. Este guia descreve como tornar esses outros apps visíveis para o seu.
Se o app for direcionado ao Android 11 ou versões mais recentes e precisar interagir
com outros apps além dos que ficam automaticamente visíveis, adicione o elemento
<queries>
ao arquivo de manifesto
do seu app. No elemento <queries>
, especifique os outros apps pelo
nome do pacote, pela assinatura da intent
ou pela autoridade do provedor, conforme descrito nas seções
a seguir.
Nomes de pacote específicos
Se você conhece o conjunto específico de apps que quer consultar ou com que quer interagir, como
apps que se integram ao seu ou apps que oferecem serviços que você usa, inclua os
nomes dos pacotes deles em um conjunto de elementos
<package>
dentro do elemento <queries>
:
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
Comunicar-se com um app host em uma biblioteca
Se você desenvolver uma biblioteca Android, poderá declarar as necessidades de visibilidade do pacote
adicionando um elemento <queries>
ao arquivo de
manifesto AAR. Esse elemento <queries>
tem a mesma
funcionalidade que o elemento que os apps podem declarar nos próprios manifestos.
Se a biblioteca envolver a comunicação com um app host, como o uso de um serviço
vinculado, inclua um elemento <package>
que
especifique o nome do pacote do app host:
<!-- Place inside the <queries> element. --> <package android:name=PACKAGE_NAME />
Ao incluir essa declaração, você pode conferir se o app host está instalado e
interagir com ele, como chamando
bindService()
.
O app de chamada que usa sua biblioteca fica automaticamente
visível para o app host como resultado
dessa interação.
Pacotes que correspondem a uma assinatura de filtro de intent
Seu app pode precisar consultar ou interagir com um conjunto de apps que atendem a uma
finalidade específica, mas você pode não saber os nomes de pacotes específicos a
serem incluídos. Nessa situação, você pode listar as
assinaturas de filtro de intent no elemento
<queries>
. Seu app vai poder descobrir apps que têm
elementos
<intent-filter>
correspondentes.
O exemplo de código a seguir mostra um elemento <intent>
que permite ao app
ver outros apps instalados que oferecem suporte ao compartilhamento de imagens JPEG:
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
O elemento <intent>
tem algumas restrições:
- É necessário incluir exatamente um elemento
<action>
. - Não é possível usar os atributos
path
,pathPrefix
,pathPattern
ouport
em um elemento<data>
. O sistema se comporta como se o valor de cada atributo fosse o valor do caractere curinga genérico (*
). - Não é possível usar o atributo
mimeGroup
de um elemento<data>
. Nos elementos
<data>
de um único elemento<intent>
, é possível usar cada um dos seguintes atributos no máximo uma vez:mimeType
scheme
host
É possível distribuir esses atributos em vários elementos
<data>
ou usá-los em um único elemento<data>
.
O elemento <intent>
aceita o caractere curinga genérico (*
) como o valor de alguns atributos:
- O atributo
name
do elemento<action>
. - O subtipo do atributo
mimeType
de um elemento<data>
(image/*
). - O tipo e subtipo do atributo
mimeType
de um elemento<data>
(*/*
). - O atributo
scheme
de um elemento<data>
. - O atributo
host
de um elemento<data>
.
A menos que especificado de outra forma na lista anterior, o sistema não oferece suporte a uma
combinação de caracteres curinga e de texto, como prefix*
.
Pacotes que usam uma autoridade específica
Se você precisar consultar um provedor
de conteúdo, mas
não souber os nomes dos pacotes específicos, declare a autoridade do provedor
em um elemento <provider>
, conforme mostrado
neste snippet:
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
É possível declarar várias autoridades do provedor em um único elemento <queries>
. No elemento
<queries>
, é possível declarar um ou mais elementos <provider>
. Um elemento
<provider>
pode incluir uma única autoridade de provedor ou uma
lista de autoridades do provedor delimitadas por ponto e vírgula.
Todos os apps (não recomendado)
Em casos raros, o app pode precisar consultar ou interagir com todos os apps instalados
em um dispositivo, independentemente dos componentes que eles contenham. Para permitir que seu app
veja todos os outros apps instalados, o sistema fornece a
permissão
QUERY_ALL_PACKAGES
.
Veja abaixo alguns exemplos de casos de uso em que a
permissão QUERY_ALL_PACKAGES
é adequada para inclusão:
- Apps de acessibilidade
- Navegadores
- Apps de gerenciamento de dispositivos
- Apps de segurança
- Apps de antivírus
No entanto, geralmente é possível atender aos casos de uso do seu app interagindo com o conjunto de apps que ficam visíveis automaticamente e declarando outros apps que seu app precisa acessar no arquivo de manifesto. Para respeitar a privacidade do usuário, seu app precisa solicitar a menor quantidade de visibilidade do pacote necessária para que ele funcione.
Esta atualização de política do Google
Play
fornece diretrizes para apps que precisam da permissão QUERY_ALL_PACKAGES
.