Zadeklaruj potrzeby związane z widocznością pakietu

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ów path, pathPrefix, pathPattern ani port. 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.