Podczas tworzenia aplikacji musisz wziąć pod uwagę inne aplikacje na urządzeniu, z którymi aplikacja ma korzystać. Jeśli kierujesz aplikację na Androida 11 (poziom interfejsu API 30) lub nowszego, system automatycznie wyświetla niektóre aplikacje, ale domyślnie odfiltrowuje inne. Z tego przewodnika dowiesz się, jak ustawić te aplikacje jako widoczne.
Jeśli Twoja aplikacja jest kierowana na Androida 11 lub nowszego i chce wchodzić w interakcje z aplikacjami innymi niż te, które są wyświetlane automatycznie, dodaj element <queries>
do pliku manifestu. W elemencie <queries>
wskaż inne aplikacje według nazwy pakietu, według podpisu intencji lub według urzędu dostawcy, jak opisano w sekcjach poniżej.
Konkretne nazwy pakietów
Jeśli znasz konkretne aplikacje, których chcesz używać do wysyłania zapytań lub interakcji (np. zintegrowanych z Twoją aplikacją lub aplikacji, z których korzystasz), umieść ich nazwy pakietów w zestawie elementów <package>
w elemencie <queries>
:
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
PackageManager
Komunikacja z aplikacją będącą hostem w bibliotece
Jeśli tworzysz bibliotekę na Androida, możesz zadeklarować potrzeby w zakresie widoczności pakietów, dodając element <queries>
w pliku manifestu AAR. Element <queries>
ma te same funkcje co element, który aplikacje mogą zadeklarować w swoich plikach manifestu.
Jeśli biblioteka obejmuje komunikację z aplikacją hostującą, na przykład korzystając z usługi powiązanej, dodaj element <package>
, który określa nazwę pakietu aplikacji hosta:
<!-- Place inside the <queries> element. --> <package android:name=PACKAGE_NAME />
Po dołączeniu tej deklaracji możesz sprawdzić, czy aplikacja hosta jest zainstalowana i wchodzić z nią w interakcje, np. wywołując bindService()
.
W wyniku tej interakcji aplikacja wywołująca, która korzysta z Twojej biblioteki, automatycznie staje się widoczna dla aplikacji hostującej.
Pakiety pasujące do podpisu filtra intencji
Twoja aplikacja może wysyłać zapytania do zestawu aplikacji służących konkretnemu celowi lub korzystać z nich w internecie, ale możesz nie znać konkretnych nazw pakietów do uwzględnienia. W takiej sytuacji możesz wymienić podpisy filtra intencji w elemencie <queries>
. Dzięki temu aplikacja może wykrywać aplikacje, które mają pasujące elementy <intent-filter>
.
Poniższy przykładowy kod zawiera element <intent>
, który umożliwia aplikacji wyświetlanie innych zainstalowanych aplikacji obsługujących udostępnianie obrazów JPEG:
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
Element <intent>
ma kilka ograniczeń:
- Musisz dodać dokładnie 1 element
<action>
. - W elemencie
<data>
nie możesz używać atrybutówpath
,pathPrefix
,pathPattern
aniport
. System działa tak, jakby wartość każdego atrybutu była ustawiona na ogólny symbol wieloznaczny (*
). - Nie możesz użyć atrybutu
mimeGroup
elementu<data>
. W obrębie elementów
<data>
pojedynczego elementu<intent>
możesz użyć najwyżej każdego z tych atrybutów:mimeType
scheme
host
Możesz rozłożyć te atrybuty na wiele elementów
<data>
lub użyć ich w jednym elemencie<data>
.
Element <intent>
może używać ogólnego symbolu wieloznacznego (*
) jako wartości kilku atrybutów:
- Atrybut
name
elementu<action>
. - Podtyp atrybutu
mimeType
elementu<data>
(image/*
). - Typ i podtyp atrybutu
mimeType
elementu<data>
(*/*
). - Atrybut
scheme
elementu<data>
. - Atrybut
host
elementu<data>
.
O ile na poprzedniej liście nie wskazano inaczej, system nie obsługuje mieszaniny złożonej z tekstu i symboli wieloznacznych, np. prefix*
.
Pakiety, które korzystają z określonych urzędów
Jeśli chcesz wysłać zapytanie do dostawcy treści, ale nie znasz konkretnych nazw pakietów, możesz zadeklarować urząd dostawcy w elemencie <provider>
, jak pokazano w tym fragmencie:
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
Urzędy dostawców możesz zadeklarować w jednym elemencie <queries>
. W elemencie <queries>
możesz zadeklarować co najmniej 1 element <provider>
. Element <provider>
może zawierać pojedynczy urząd dostawcy lub rozdzielaną średnikami listę urzędów dostawcy.
Wszystkie aplikacje (niezalecane)
W rzadkich przypadkach może być konieczne wysyłanie zapytań do wszystkich aplikacji zainstalowanych na urządzeniu lub korzystanie z nich niezależnie od zawartych w nich komponentów. Aby aplikacja mogła wyświetlić wszystkie inne zainstalowane aplikacje, system udostępnia uprawnienie QUERY_ALL_PACKAGES
.
Oto kilka przykładów przypadków użycia, w których można użyć uprawnienia QUERY_ALL_PACKAGES
:
- Aplikacje ułatwień dostępu
- Przeglądarki
- Aplikacje do zarządzania urządzeniami
- Aplikacje zabezpieczające
- Aplikacje antywirusowe
Zazwyczaj jest to jednak możliwe, wchodząc w interakcję z zestawem aplikacji, które są widoczne automatycznie , i deklarując w pliku manifestu inne aplikacje, do których aplikacja potrzebuje dostępu. Aby chronić prywatność użytkowników, Twoja aplikacja powinna prosić o jak najmniejszą widoczność pakietu niezbędną do działania.
Ta aktualizacja zasad Google Play zawiera wytyczne dotyczące aplikacji, które potrzebują uprawnienia QUERY_ALL_PACKAGES
.