Wenn Sie Ihre App erstellen, sollten Sie die anderen Apps auf dem Gerät berücksichtigen, mit denen Ihre App interagieren muss. Wenn Ihre App auf Android 11 (API-Level 30) oder höher ausgerichtet ist, werden einige Apps automatisch für Ihre App sichtbar, andere Apps werden standardmäßig herausgefiltert. In diesem Leitfaden wird beschrieben, wie Sie diese anderen Apps für Ihre App sichtbar machen.
Wenn Ihre App auf Android 11 oder höher ausgerichtet ist und mit anderen Apps als den automatisch sichtbaren interagieren muss, fügen Sie das Element <queries>
in die Manifestdatei Ihrer App ein. Geben Sie die anderen Apps im Element <queries>
anhand des Paketnamens, anhand der Intent-Signatur oder anhand der Anbieterautorität an, wie in den folgenden Abschnitten beschrieben.
Bestimmte Paketnamen
Wenn Sie die Apps kennen, die Sie abfragen oder mit denen Sie interagieren möchten, z. B. Apps, die in Ihre App eingebunden sind, oder Apps, deren Dienste Sie verwenden, fügen Sie die Paketnamen in eine Reihe von <package>
-Elementen innerhalb des <queries>
-Elements ein:
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
Mit einer Host-App in einer Bibliothek kommunizieren
Wenn Sie eine Android-Bibliothek entwickeln, können Sie die Anforderungen an die Sichtbarkeit des Pakets deklarieren, indem Sie ein <queries>
-Element in die Manifestdatei der AAR einfügen. Dieses <queries>
-Element hat die gleichen Funktionen wie das Element, das Apps in ihren eigenen Manifesten deklarieren können.
Wenn Ihre Bibliothek die Kommunikation mit einer Host-App umfasst, z. B. über einen gebundenen Dienst, fügen Sie ein <package>
-Element hinzu, das den Paketnamen der Host-App angibt:
<!-- Place inside the <queries> element. --> <package android:name=PACKAGE_NAME />
Wenn Sie diese Deklaration einfügen, können Sie prüfen, ob die Host-App installiert ist, und mit ihr interagieren, z. B. durch Aufrufen von bindService()
.
Die aufrufende App, die Ihre Bibliothek verwendet, wird durch diese Interaktion automatisch für die Host-App sichtbar.
Pakete, die mit einer Intent-Filtersignatur übereinstimmen
Möglicherweise muss Ihre Anwendung eine Reihe von Anwendungen, die einem bestimmten Zweck dienen, abfragen oder mit ihnen interagieren, aber möglicherweise kennen Sie die entsprechenden Paketnamen nicht. In diesem Fall können Sie im Element <queries>
Intent-Filtersignaturen auflisten. Ihre App kann dann Apps finden, die über passende <intent-filter>
-Elemente verfügen.
Das folgende Codebeispiel zeigt ein <intent>
-Element, mit dem die App andere installierte Apps sehen kann, die die Freigabe von JPEG-Bildern unterstützen:
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
Das <intent>
-Element hat einige Einschränkungen:
- Du musst genau ein
<action>
-Element angeben. - Die Attribute
path
,pathPrefix
,pathPattern
oderport
dürfen nicht in einem<data>
-Element verwendet werden. Das System verhält sich so, als hätten Sie für jedes Attribut den generischen Platzhalter (*
) festgelegt. - Sie können das Attribut
mimeGroup
eines<data>
-Elements nicht verwenden. Innerhalb der
<data>
-Elemente eines einzelnen<intent>
-Elements kannst du die folgenden Attribute maximal einmal verwenden:mimeType
scheme
host
Sie können diese Attribute auf mehrere
<data>
-Elemente verteilen oder sie in einem einzigen<data>
-Element verwenden.
Das Element <intent>
unterstützt das generische Platzhalterzeichen (*
) als Wert für einige Attribute:
- Das Attribut
name
des Elements<action>
. - Der Untertyp des
mimeType
-Attributs eines<data>
-Elements (image/*
). - Der Typ und Untertyp des Attributs
mimeType
eines<data>
-Elements (*/*
). - Das
scheme
-Attribut eines<data>
-Elements. - Das
host
-Attribut eines<data>
-Elements.
Sofern in der vorherigen Liste nicht anders angegeben, unterstützt das System keine Kombination aus Text und Platzhalterzeichen wie prefix*
.
Pakete, für die eine bestimmte Zertifizierungsstelle verwendet wird
Wenn du einen Inhaltsanbieter abfragen möchtest, aber die spezifischen Paketnamen nicht kennst, kannst du die Anbieterautorität in einem <provider>
-Element angeben, wie im folgenden Snippet gezeigt:
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
Sie können Anbieterstellen in einem einzigen <queries>
-Element deklarieren. Innerhalb des <queries>
-Elements können Sie ein oder mehrere <provider>
-Elemente deklarieren. Ein <provider>
-Element kann eine einzelne Anbieterautorität oder eine durch Semikolons getrennte Liste von Anbieterbehörden enthalten.
Alle Apps (nicht empfohlen)
In seltenen Fällen muss Ihre App möglicherweise alle auf einem Gerät installierten Apps abfragen oder mit ihnen interagieren, unabhängig von den darin enthaltenen Komponenten. Damit Ihre App alle anderen installierten Apps sehen kann, erteilt das System die Berechtigung QUERY_ALL_PACKAGES
.
Beispiele für Anwendungsfälle, in denen die Berechtigung QUERY_ALL_PACKAGES
angebracht ist:
- Bedienungshilfen-Apps
- Browser
- Apps zur Geräteverwaltung
- Sicherheits-Apps
- Antiviren-Apps
In der Regel ist es jedoch möglich, die Anwendungsfälle Ihrer App zu erfüllen, indem Sie mit den Apps interagieren, die automatisch sichtbar sind , und die anderen Apps, auf die Ihre App zugreifen muss, in Ihrer Manifestdatei deklarieren. Aus Datenschutzgründen sollte Ihre App nur die minimale Sichtbarkeit des Pakets anfordern, die für die Funktion Ihrer App erforderlich ist.
Dieses Richtlinienupdate von Google Play enthält Richtlinien für Apps, die die Berechtigung QUERY_ALL_PACKAGES
benötigen.