Android Permissions
Willemers Informatik-Ecke

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.

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);
    }
}