Anforderungen an die Paketsichtbarkeit deklarieren

Beim Erstellen Ihrer App ist es wichtig, die anderen Apps auf dem Gerät zu 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 werden jedoch 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 nicht mit den automatisch sichtbaren Apps interagieren muss, fügen Sie der Manifestdatei Ihrer App das Element <queries> hinzu. Geben Sie im Element <queries> die anderen Anwendungen nach Paketname, nach Intent-Signatur oder nach Anbieterautorität an, wie in den folgenden Abschnitten beschrieben.

Bestimmte Paketnamen

Wenn Sie bestimmte Apps kennen, die Sie abfragen oder mit denen Sie interagieren möchten, z. B. Apps, die in Ihre App integriert sind, oder Anwendungen, deren Dienste Sie verwenden, fügen Sie deren 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 du eine Android-Bibliothek entwickelst, kannst du der AAR-Manifestdatei ein <queries>-Element hinzufügen, um die Anforderungen an die Paketsichtbarkeit zu deklarieren. Dieses <queries>-Element hat dieselbe Funktion wie das Element, das Apps in ihren eigenen Manifesten deklarieren können.

Wenn Ihre Bibliothek die Kommunikation mit einer Host-App umfasst, z. B. die Verwendung eines gebundenen Dienstes, fügen Sie ein <package>-Element ein, das den Paketnamen der Host-App angibt:

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

Durch das Einfügen dieser Deklaration können Sie prüfen, ob die Host-App installiert ist und mit ihr interagiert, 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 einer Intent-Filtersignatur entsprechen

Ihre Anwendung muss möglicherweise eine Reihe von Anwendungen abfragen oder mit ihnen interagieren, die einem bestimmten Zweck dienen, aber Sie kennen möglicherweise nicht die spezifischen Paketnamen, die enthalten sein sollen. In diesem Fall können Sie im <queries>-Element Intent-Filtersignaturen auflisten. Ihre App kann dann Apps mit übereinstimmenden <intent-filter>-Elementen erkennen.

Das folgende Codebeispiel zeigt ein <intent>-Element, mit dem die App andere installierte Apps aufrufen 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>

Für das <intent>-Element gelten einige Einschränkungen:

  • Sie müssen genau ein <action>-Element angeben.
  • Sie können die Attribute path, pathPrefix, pathPattern oder port nicht in einem <data>-Element verwenden. Das System verhält sich so, als würden Sie den Wert jedes Attributs auf das generische Platzhalterzeichen (*) festlegen.
  • Sie können das Attribut mimeGroup eines <data>-Elements nicht verwenden.
  • Innerhalb der <data>-Elemente eines einzelnen <intent>-Elements können Sie jedes der folgenden Attribute maximal einmal verwenden:

    • mimeType
    • scheme
    • host

    Sie können diese Attribute auf mehrere <data>-Elemente verteilen oder sie in einem einzelnen <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 Attributs mimeType eines <data>-Elements (image/*).
  • Der Typ und der Untertyp des Attributs mimeType eines <data>-Elements (*/*).
  • Das Attribut scheme eines <data>-Elements.
  • Das Attribut host eines <data>-Elements.

Sofern in der vorherigen Liste nicht anders angegeben, unterstützt das System keine Kombination aus Text und Platzhalterzeichen wie prefix*.

Pakete, die eine bestimmte Behörde verwenden

Wenn Sie einen Contentanbieter abfragen müssen, aber die spezifischen Paketnamen nicht kennen, können Sie die Anbieterautorität in einem <provider>-Element deklarieren, wie im folgenden Snippet gezeigt:

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

Sie können Anbieterautoritäten in einem einzelnen <queries>-Element deklarieren. Innerhalb des <queries>-Elements können Sie ein oder mehrere <provider>-Elemente angeben. Ein <provider>-Element kann eine einzelne Anbieterautorität oder eine durch Semikolons getrennte Liste von Anbieterautoritäten enthalten.

Alle Apps (nicht empfohlen)

In seltenen Fällen kann es erforderlich sein, dass Ihre Anwendung alle auf einem Gerät installierten Anwendungen abfragen oder mit ihnen interagieren muss, unabhängig von den Komponenten, die sie enthalten. Damit Ihre App alle anderen installierten Apps sehen kann, erteilt das System die Berechtigung QUERY_ALL_PACKAGES.

Hier einige Beispiele für Anwendungsfälle, in denen die Berechtigung QUERY_ALL_PACKAGES zulässig ist:

  • Bedienungshilfen-Apps
  • Browser
  • Apps zur Geräteverwaltung
  • Sicherheits-Apps
  • Antiviren-Apps

Normalerweise ist es jedoch möglich, die Anwendungsfälle Ihrer Anwendung zu erfüllen, indem Sie mit den automatisch sichtbaren Anwendungen interagieren und in Ihrer Manifestdatei die anderen Anwendungen deklarieren, auf die Ihre Anwendung zugreifen muss. Um die Privatsphäre der Nutzer zu respektieren, sollte Ihre Anwendung so wenig Paketsichtbarkeit wie erforderlich machen, damit sie funktioniert.

Dieses Richtlinienupdate von Google Play enthält Richtlinien für Apps, die die Berechtigung QUERY_ALL_PACKAGES benötigen.