Die Berechtigungen für die Verwendung mancher Ressourcen müssen vom Benutzer genehmigt werden. Dazu muss der Programmierer zunächst die benötigten Berechtigungen in der Datei AndroidManifest.xml eintragen.
Damit ein Programm beispielsweise im Netzwerk arbeiten darf, muss es die Erlaubnis für INTERNET haben. Dazu muss unter uses-permission der folgender Eintrag stehen:
<uses-permission android:name="android.permission.INTERNET"/> </manifest>
Abfrage nach den Permissions
Abfragen der „Dangerous Permissions” müssen vor jeder Benutzung durchgeführt werden. Dazu wird die Methode checkSelfPermission aufgerufen. Das folgende Beispiel fragt ab, ob die Anwendung berechtigt ist, einen genauen Standort (ACCESS_FINE_LOCATION) zu bestimmen:int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); if (permission == PackageManager.PERMISSION_GRANTED) { // Das Programm hat die Permission, der Dienst darf genutzt werden // ... } else { // Bitte den Benutzer per Dialog um Erlaubnis. ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, myRequestCode); }
Benutzerdialog
Sollte die Permission nicht vergeben sein, kann über die Methode requestPermissions der Benutzer nach dem Recht befragt werden. Dabei wird ein entsprechender Dialog auf dem Display erscheinen.
- Der erste Parameter ist der Context. Dieser wird meist per this übergeben, da der Dialog oft aus dem onCreate der Activity startet. Wird der Dialog aus der anonymen Direktimplementierung eines Listeners gestartet, kann MainActivity.this verwendet werden.
- Der zweite Parameter ist ein String-Array. Darin befinden sich die Berechtigungen, die der Anwender bestätigen soll.
- Der letzte Parameter (requestCode) ist eine Nummer, die der Programmierer für die gewünschte Ressource festlegt. Sie dient als Wiedererkennungsmerkmal für die Ereignisbehandlungsmethode (siehe unten). Oft findet man in Beispielprogrammen hier 123 oder 23.
Dialogergebnis als Ereignis
Das Ergebnis dieses Dialogs steht nicht sofort zur Verfügung. Der Dialog blockiert das Programm nicht, sondern das Programm läuft während des Dialogs weiter. Das Programm erfährt das Ergebnis des Dialogs, indem es die Methode onRequestPermissionsResult überschreibt.@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { // Requests können für mehrere Ressourcen eingetroffen sein. // Prüfe erst einmal, ob es mein Request-Code ist if (requestCode==myRequestCode) { if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Zugriff erlaubt } else { // Zugriff verboten } } else { super.onRequestPermissionsResult(requestCode, permissions,grantResults); } }