Berechtigungen werden nicht nur zum Anfordern von Systemfunktionen verwendet. Sie können auch einschränken, wie andere Apps mit den Komponenten Ihrer App interagieren dürfen.
In diesem Leitfaden wird erläutert, wie Sie die von einer anderen App deklarierten Berechtigungen prüfen. Außerdem wird darin beschrieben, wie Sie Aktivitäten, Dienste, Contentanbieter und Broadcast-Empfänger konfigurieren können, um einzuschränken, wie andere Apps mit Ihrer App interagieren können.
Berechtigungen einer anderen App prüfen
So rufen Sie die Berechtigungen auf, die von einer anderen App deklariert werden:
- Öffnen Sie den Bildschirm App-Info einer App.
Wähle Berechtigungen aus. Der Bildschirm App-Berechtigungen wird geladen.
Auf diesem Bildschirm werden verschiedene Berechtigungsgruppen angezeigt. Das System ordnet die von einer App deklarierten Berechtigungen diesen Gruppen zu.
Es gibt eine Reihe weiterer nützlicher Möglichkeiten, Berechtigungen zu prüfen:
- Wenn Sie eine Berechtigung während eines Anrufs an einen Dienst prüfen möchten, übergeben Sie einen Berechtigungsstring an
Context.checkCallingPermission(). Diese Methode gibt eine Ganzzahl zurück, die angibt, ob die Berechtigung dem aktuellen aufrufenden Prozess erteilt wurde. Diese Methode kann nur verwendet werden, wenn Sie einen Aufruf aus einem anderen Prozess ausführen, in der Regel über eine IDL-Schnittstelle, die von einem Dienst veröffentlicht oder auf andere Weise an einen anderen Prozess übergeben wird. - Wenn Sie prüfen möchten, ob einem anderen Prozess eine bestimmte Berechtigung erteilt wurde, übergeben Sie die Prozess-ID (PID) an
Context.checkPermission(). - Wenn Sie prüfen möchten, ob einem anderen Paket eine bestimmte Berechtigung erteilt wurde, übergeben Sie den Paketnamen an
PackageManager.checkPermission().
Interaktionen mit den Aktivitäten Ihrer App einschränken
Verwenden Sie im Manifest das Attribut android:permission des Tags <activity>, um einzuschränken, welche anderen Apps diese Activity starten können. Die Berechtigung wird während Context.startActivity() und Activity.startActivityForResult() geprüft. Wenn der Aufrufer nicht die erforderliche Berechtigung hat, tritt ein SecurityException auf.
Interaktionen mit den Diensten Ihrer App einschränken
Verwenden Sie im Manifest das Attribut android:permission des Tags <service>, um einzuschränken, welche anderen Apps die zugehörige Service starten oder daran binden können. Die Berechtigung wird während Context.startService(), Context.stopService() und Context.bindService() geprüft. Wenn der Aufrufer nicht die erforderliche Berechtigung hat, tritt ein SecurityException auf.
Interaktionen mit den Contentanbietern Ihrer App einschränken
Verwenden Sie im Manifest das Attribut android:permission des Tags <provider>, um einzuschränken, welche anderen Apps auf die Daten in einem ContentProvider zugreifen können.
Inhaltsanbietern steht eine wichtige zusätzliche Sicherheitsfunktion zur Verfügung, die als URI-Berechtigungen bezeichnet wird und im nächsten Abschnitt beschrieben wird.
Im Gegensatz zu den anderen Komponenten gibt es zwei separate Berechtigungsattribute, die Sie für Contentanbieter festlegen können: android:readPermission schränkt ein, welche anderen Apps Daten vom Anbieter lesen können, und android:writePermission schränkt ein, welche anderen Apps Daten in den Anbieter schreiben können. Wenn ein Anbieter sowohl durch eine Lese- als auch durch eine Schreibberechtigung geschützt ist, darf eine App nicht aus einem Anbieter lesen, wenn sie nur die Schreibberechtigung hat.
Die Berechtigungen werden beim ersten Abrufen des Anbieters und bei Vorgängen einer App für den Anbieter geprüft. Wenn die anfragende App keine der beiden Berechtigungen hat, tritt ein SecurityException auf. Für die Verwendung von ContentResolver.query() ist die Leseberechtigung erforderlich. Für die Verwendung von ContentResolver.insert(), ContentResolver.update() oder ContentResolver.delete() ist die Schreibberechtigung erforderlich. In all diesen Fällen führt das Fehlen der erforderlichen Berechtigung zu einem SecurityException.
Zugriff pro URI gewähren
Das System bietet Ihnen zusätzliche detaillierte Kontrolle darüber, wie andere Apps auf die Contentanbieter Ihrer App zugreifen können. Insbesondere kann sich Ihr Inhaltsanbieter mit Lese- und Schreibberechtigungen schützen und gleichzeitig seinen direkten Clients erlauben, bestimmte URIs für andere Apps freizugeben. Wenn Sie angeben möchten, dass Ihre App dieses Modell unterstützt, verwenden Sie das Attribut android:grantUriPermissions oder das Element <grant-uri-permission>.
Sie können Berechtigungen auch pro URI erteilen. Wenn Sie eine Aktivität starten oder ein Ergebnis an 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- oder Lese- und Schreibberechtigungen für den Daten-URI, der im Intent enthalten ist. Andere Apps erhalten diese Berechtigungen für den jeweiligen URI, unabhängig davon, ob sie allgemein Zugriff auf Daten im Contentanbieter haben.
Angenommen, ein Nutzer verwendet Ihre App, um eine E‑Mail mit einem Bildanhang anzusehen. Andere Apps sollten im Allgemeinen nicht auf die E‑Mail-Inhalte zugreifen können, aber möglicherweise das Bild ansehen möchten. Ihre App kann einen Intent und das Intent-Flag Intent.FLAG_GRANT_READ_URI_PERMISSION verwenden, damit eine Bildanzeige-App das Bild sehen kann.
Ein weiterer Aspekt ist die Sichtbarkeit der App. Wenn Ihre App auf Android 11 (API‑Level 30) oder höher ausgerichtet ist, macht das System einige Apps automatisch für Ihre App sichtbar und blendet andere Apps standardmäßig aus. Wenn Ihre App einen Contentanbieter hat und einer anderen App URI-Berechtigungen erteilt hat, ist Ihre App automatisch für diese andere App 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 des Tags <receiver> können Sie einschränken, welche anderen Apps Broadcasts an die zugehörige BroadcastReceiver senden können. Das System prüft die Berechtigung nach der Rückgabe von Context.sendBroadcast(), da es versucht, die eingereichte Broadcast-Nachricht an den angegebenen Empfänger zu senden. Das bedeutet, dass ein Berechtigungsfehler nicht dazu führt, dass eine Ausnahme an den Aufrufer zurückgegeben wird. Stattdessen wird einfach nicht die Intent zurückgegeben.
Sie können Berechtigungen auch programmatisch konfigurieren:
- So legen Sie fest, welche anderen Apps Broadcasts an einen programmatisch registrierten Receiver senden dürfen:Geben Sie eine Berechtigung für
Context.registerReceiver()an. - Einschränken, welche Broadcast-Empfänger einen Broadcast empfangen können:Geben Sie beim Aufrufen von
Context.sendBroadcast()eine Berechtigung an.
Sowohl ein Empfänger als auch ein Sender können eine Berechtigung erfordern. In diesem Fall müssen beide Berechtigungsprüfungen bestanden werden, damit der Intent an das zugehörige Ziel gesendet werden kann. Weitere Informationen finden Sie unter Übertragungen mit Berechtigungen einschränken.