Interaktionen mit anderen Apps einschränken

Berechtigungen dienen nicht nur zum Anfordern von Systemfunktionen. Sie können auch einschränken, wie andere Apps mit den Komponenten Ihrer App interagieren können.

In diesem Leitfaden wird erläutert, wie du den von einer anderen App deklarierten Berechtigungssatz prüfen kannst. In diesem Leitfaden wird auch erläutert, wie Sie Aktivitäten, Dienste, Contentanbieter und Sendeempfänger konfigurieren können, um einzuschränken, wie andere Apps mit Ihrer App interagieren können.

Berechtigungen einer anderen App prüfen

Verwenden Sie ein Gerät oder einen Emulator, um die folgenden Schritte auszuführen, um die von einer anderen App deklarierten Berechtigungen anzusehen:

  1. Öffnen Sie den Bildschirm App-Info einer App.
  2. Wählen Sie Berechtigungen aus. Der Bildschirm App-Berechtigungen wird geladen.

    Dieser Bildschirm zeigt eine Reihe von Berechtigungsgruppen. Das System organisiert die Berechtigungen, die eine App deklariert hat, in diesen Gruppen.

Es gibt noch weitere nützliche Möglichkeiten, die Berechtigungen zu prüfen:

  • Übergeben Sie während eines Aufrufs eines Dienstes einen Berechtigungsstring an Context.checkCallingPermission(). Diese Methode gibt eine Ganzzahl zurück, die angibt, ob diese Berechtigung dem aktuell aufrufenden Prozess gewährt wurde. Beachten Sie, dass dies nur verwendet werden kann, wenn Sie einen Aufruf ausführen, der von einem anderen Prozess kommt, in der Regel über eine IDL-Schnittstelle, die von einem Dienst veröffentlicht wurde oder auf eine andere Weise an einen anderen Prozess übergeben wird.
  • Übergeben Sie den Prozess (PID) an Context.checkPermission(), um zu prüfen, ob einem anderen Prozess eine bestimmte Berechtigung gewährt wurde.
  • Wenn Sie prüfen möchten, ob einem anderen Paket eine bestimmte Berechtigung gewährt wurde, übergeben Sie den Paketnamen in PackageManager.checkPermission().

Interaktionen mit App-Aktivitäten einschränken

Verwende das Attribut android:permission für das Tag <activity> im Manifest, um einzuschränken, welche anderen Apps diese Activity starten können. Die Berechtigung wird in den Phasen Context.startActivity() und Activity.startActivityForResult() geprüft. Wenn der Aufrufer nicht die erforderliche Berechtigung hat, wird ein SecurityException ausgelöst.

Interaktionen mit Diensten Ihrer App einschränken

Verwende das android:permission-Attribut für das <service>-Tag im Manifest, um einzuschränken, welche anderen Apps starten oder an die verknüpfte Service binden können. Die Berechtigung wurde während Context.startService(), Context.stopService() und Context.bindService() geprüft. Wenn der Aufrufer nicht die erforderliche Berechtigung hat, wird ein SecurityException ausgelöst.

Interaktionen mit Contentanbietern Ihrer App einschränken

Mit dem Attribut android:permission für das Tag <provider> kannst du einschränken, welche anderen Apps auf die Daten in einer ContentProvider zugreifen können. Contentanbieter stellen ihnen eine wichtige zusätzliche Sicherheitsfunktion zur Verfügung, die im folgenden Abschnitt beschrieben wird: URI-Berechtigungen. Im Gegensatz zu den anderen Komponenten gibt es zwei separate Berechtigungsattribute, die Sie für Inhaltsanbieter festlegen können: android:readPermission schränkt ein, welche anderen Anwendungen vom Anbieter lesen können, und android:writePermission schränkt ein, welche anderen Anwendungen in sie schreiben können. Wenn ein Anbieter sowohl durch eine Lese- als auch eine Schreibberechtigung geschützt ist, kann eine App nicht von einem Anbieter lesen, wenn nur die Schreibberechtigung vorhanden ist.

Die Berechtigungen werden geprüft, wenn der Anbieter zum ersten Mal abgerufen wird und eine Anwendung Vorgänge beim Anbieter ausführt. Wenn die anfragende App keine dieser Berechtigungen hat, wird ein SecurityException-Fehler ausgelöst. Für die Verwendung von ContentResolver.query() ist die Leseberechtigung erforderlich, für ContentResolver.insert(), ContentResolver.update() oder ContentResolver.delete() ist die Schreibberechtigung erforderlich. In allen diesen Fällen führt das Fehlen der erforderlichen Berechtigung zu einem SecurityException.

Zugriff pro URI gewähren

Das System bietet Ihnen eine zusätzliche fein abgestimmte Kontrolle darüber, wie andere Apps auf die Inhaltsanbieter Ihrer App zugreifen können. Insbesondere kann sich Ihr Contentanbieter mit Lese- und Schreibberechtigungen schützen, während er seinen Direktclients weiterhin erlaubt, bestimmte URIs an andere Apps weiterzugeben. Mit dem Attribut android:grantUriPermissions oder dem Element <grant-uri-permission> können Sie die Unterstützung Ihrer App für dieses Modell deklarieren.

Sie können Berechtigungen auch für einzelne URIs erteilen. Wenn Sie eine Aktivität starten oder ein Ergebnis für eine Aktivität zurückgeben, legen Sie das Intent-Flag Intent.FLAG_GRANT_READ_URI_PERMISSION, das Intent-Flag Intent.FLAG_GRANT_WRITE_URI_PERMISSION oder beide Flags fest. Dadurch erhalten andere Apps Lese-, Schreib- bzw. Lese-/Schreibberechtigungen für den Daten-URI, der im Intent enthalten ist. Andere Apps erhalten diese Berechtigungen für den spezifischen URI, unabhängig davon, ob sie allgemein die Berechtigung für den Zugriff auf Daten beim Contentanbieter haben.

Angenommen, ein Nutzer verwendet Ihre Anwendung, um eine E-Mail mit einem Bildanhang zu öffnen. Andere Anwendungen sollten generell nicht auf den E-Mail-Inhalt zugreifen können, für sie könnte jedoch ein Interesse an der Anzeige des Bildes bestehen. Ihre App kann einen Intent und das Intent-Flag Intent.FLAG_GRANT_READ_URI_PERMISSION verwenden, damit eine App zur Bildanzeige das Bild sehen kann.

Ein weiterer Aspekt ist die Sichtbarkeit der App. Wenn deine App auf Android 11 (API-Level 30) oder höher ausgerichtet ist, werden einige Apps automatisch für die App sichtbar und andere werden standardmäßig ausgeblendet. Wenn Ihre App einen Contentanbieter und einer anderen App URI-Berechtigungen erteilt hat, ist die App für diese automatisch sichtbar.

Weitere Informationen finden Sie im Referenzmaterial für die Methoden grantUriPermission(), revokeUriPermission() und checkUriPermission().

Interaktionen mit den Übertragungsempfängern Ihrer App einschränken

Mit dem Attribut android:permission für das Tag <receiver> kannst du einschränken, welche anderen Apps Broadcasts an die verknüpfte BroadcastReceiver senden können. Die Berechtigung wird geprüft, nachdem Context.sendBroadcast() zurückgegeben wurde, da das System versucht, die gesendete Übertragung an den angegebenen Empfänger zu senden. Dies bedeutet, dass ein Berechtigungsfehler nicht dazu führt, dass eine Ausnahme an den Aufrufer zurückgegeben wird. Es wird lediglich nicht die Intent gesendet.

Auf dieselbe Weise kannst du Context.registerReceiver() eine Berechtigung zur Verfügung stellen, um zu steuern, welche anderen Apps an einen programmatisch registrierten Empfänger gesendet werden können. Umgekehrt können Sie beim Aufrufen von Context.sendBroadcast() eine Berechtigung bereitstellen, um einzuschränken, welche Broadcast-Empfänger die Übertragung empfangen können.

Beachte, dass sowohl ein Empfänger als auch ein Sender eine Berechtigung benötigen können. In diesem Fall müssen beide Berechtigungsprüfungen bestanden werden, damit der Intent an das verknüpfte Ziel gesendet wird. Weitere Informationen findest du unter Übertragungen mit Berechtigungen einschränken.