Zadeklaruj potrzeby związane z widocznością pakietu

Podczas tworzenia aplikacji należy zastanowić się nad innymi aplikacjami na urządzeniu, z którymi aplikacja musi wchodzić w interakcje. Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, system automatycznie zobaczy dla niej niektóre aplikacje, ale inne domyślnie odfiltrowuje. Z tego przewodnika dowiesz się, jak ustawić te aplikacje dla aplikacji jako widoczne.

Jeśli Twoja aplikacja jest kierowana na Androida 11 lub nowszego i musi wchodzić w interakcje z aplikacjami innymi niż te, które są widoczne automatycznie, dodaj element <queries> w pliku manifestu aplikacji. W elemencie <queries> wskaż inne aplikacje według nazwy pakietu, podpisu intencji lub według urzędu dostawcy zgodnie z opisem w sekcjach poniżej.

Konkretne nazwy pakietów

Jeśli wiesz, których aplikacji chcesz używać do wysyłania zapytań lub interakcji z nimi (np. takich, które integrują się z Twoją aplikacją lub z których usług korzystasz), umieść nazwy tych aplikacji 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>

Komunikuj się z aplikacją hostującą 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. Ten element <queries> ma takie same funkcje jak element, który aplikacje mogą zadeklarować w swoich plikach manifestu.

Jeśli Twoja biblioteka wymaga komunikacji z aplikacją hosta, na przykład korzystania z powiązanej usługi, 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 hostująca jest zainstalowana i wchodzić z nią w interakcje, na przykład wywołując metodę bindService(). W wyniku tej interakcji aplikacja do wykonywania połączeń, która używa Twojej biblioteki, automatycznie staje się widoczna dla aplikacji hostującej.

Pakiety pasujące do podpisu filtra intencji

Aplikacja może wymagać zapytania lub interakcji z zestawem aplikacji, które służą do konkretnego celu, ale nie znasz konkretnych nazw pakietów, które należy uwzględnić. W takiej sytuacji w elemencie <queries> możesz wyświetlić podpisy filtrów intencji. Dzięki temu aplikacja może wykrywać aplikacje, które pasują do elementów <intent-filter>.

Poniższy przykładowy kod pokazuje element <intent>, który umożliwi aplikacji sprawdzenie innych zainstalowanych aplikacji obsługujących udostępnianie obrazów w formacie 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 uwzględnić 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 została ustawiona na ogólny symbol wieloznaczny (*).
  • Nie możesz używać atrybutu mimeGroup elementu <data>.
  • W elementach <data> pojedynczego elementu <intent> możesz użyć jednocześnie 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 pojedynczym elemencie <data>.

Element <intent> obsługuje jako wartość kilku atrybutów ogólny symbol wieloznaczny (*):

  • 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 określono inaczej, system nie obsługuje kombinacji tekstu i znaków wieloznacznych, takich jak prefix*.

Pakiety korzystające 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 w tym fragmencie:

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

Możesz zadeklarować urzędy dostawcy w pojedynczym elemencie <queries>. W elemencie <queries> możesz zadeklarować co najmniej 1 element <provider>. Element <provider> może zawierać pojedynczy organ dostawcy lub listę urzędów dostawcy rozdzielaną średnikami.

Wszystkie aplikacje (niezalecane)

W rzadkich przypadkach aplikacja może wymagać wysyłania zapytań dotyczących wszystkich aplikacji zainstalowanych na urządzeniu lub interakcji z nimi niezależnie od zawartych w nich komponentów. Aby umożliwić aplikacji wyświetlanie wszystkich innych zainstalowanych aplikacji, system udostępnia uprawnienie QUERY_ALL_PACKAGES.

Oto kilka przykładów przypadków użycia, w których warto uwzględnić uprawnienie QUERY_ALL_PACKAGES:

  • Aplikacje ułatwień dostępu
  • Przeglądarki
  • Aplikacje do zarządzania urządzeniami
  • Aplikacje zabezpieczające
  • Aplikacje antywirusowe

Jednak wykorzystanie aplikacji jest zwykle możliwe przez interakcję z zestawem aplikacji, które są widoczne automatycznie , i zadeklarowanie w pliku manifestu innych aplikacji, których potrzebuje aplikacja. Ze względu na prywatność użytkownika aplikacja powinna prosić o najmniejszą widoczność pakietu, która jest niezbędna do działania.

W tej aktualizacji zasad Google Play znajdziesz wskazówki dotyczące aplikacji, które wymagają uprawnienia QUERY_ALL_PACKAGES.