Anforderungen an die Paketsichtbarkeit deklarieren

Beim Erstellen Ihrer App ist es wichtig, die anderen Apps auf dem Gerät zu berücksichtigen, mit denen sie interagieren muss. Wenn deine App auf Android 11 (API-Level 30) oder höher ausgerichtet ist, werden einige Apps automatisch für deine App sichtbar. Andere Apps werden jedoch standardmäßig herausgefiltert. In diesem Leitfaden wird beschrieben, wie du diese anderen Apps für deine App sichtbar machst.

Wenn deine App auf Android 11 oder höher ausgerichtet ist und mit anderen als den automatisch sichtbaren Apps interagieren muss, füge der Manifestdatei deiner App das Element <queries> hinzu. Geben Sie im <queries>-Element die anderen Apps anhand des Paketnamens, nach Intent-Signatur oder nach Anbieterbefugnis an, wie in den folgenden Abschnitten beschrieben.

Bestimmte Paketnamen

Wenn Sie die Anwendungen kennen, die Sie abfragen oder mit denen Sie interagieren möchten, z. B. Anwendungen, die sich in Ihre Anwendung einbinden lassen oder deren Dienste Sie verwenden, fügen Sie deren Paketnamen in eine Reihe von <package>-Elementen im <queries>-Element 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 die Anforderungen an die Paketsichtbarkeit deklarieren, indem du der AAR-Manifestdatei ein <queries>-Element hinzufügst. 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. 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 Einfügen dieser Deklaration können Sie prüfen, ob die Host-App installiert ist und mit ihr interagieren kann, 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 mit übereinstimmenden <intent-filter>-Elementen erkennen.

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>

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

  • Du musst genau ein <action>-Element angeben.
  • Sie können die Attribute path, pathPrefix, pathPattern oder port in einem <data>-Element nicht verwenden. Das System verhält sich so, als würden Sie für jeden Attributwert das generische Platzhalterzeichen (*) festlegen.
  • 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 Attributs mimeType 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, die eine bestimmte Behörde verwenden

Wenn Sie einen Contentanbieter abfragen müssen, aber die genauen 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 Anbieterstellen in einem einzigen <queries>-Element deklarieren. Innerhalb des <queries>-Elements können Sie ein oder mehrere <provider>-Elemente angeben. Ein <provider>-Element kann eine einzelne Anbieterbehörde oder eine durch Semikolons getrennte Liste von Anbieterstellen enthalten.

Alle Apps (nicht empfohlen)

In seltenen Fällen muss Ihre App möglicherweise alle auf einem Gerät installierten Apps abfragen oder damit 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.

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

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

Normalerweise ist es jedoch möglich, die Anwendungsfälle deiner App durch Interaktion mit einer Reihe von Apps zu erfüllen, die automatisch sichtbar sind, und indem du die anderen Apps, auf die deine App Zugriff benötigt, in der Manifestdatei deklarieren. Aus Datenschutzgründen sollte deine App nur die geringstmögliche Paketsichtbarkeit anfordern, die erforderlich ist, damit deine App funktioniert.

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