Apps für Android programmieren leicht gemacht!
Android 6 - Berechtigung einholen

Android 6 – Berechtigung einholen

Seit Android 6.0 ist es für jeden Entwickler Pflicht für persönliche Daten eine besondere Berechtigung einzuholen.

Wir müssen dem Nutzer nun beim Start der App oder an entsprechender Stelle ein Pop-Up anzuzeigen, auf dem der Nutzer noch einmal explizit einer Berechtigung zustimmen muss.

Dazu gehören unter anderem Berechtigungen wie Daten, Kamera, Mikrofon, Telefon und dem Standort.
Wir möchten an dieser Stelle einmal klären, wie wir dem Nutzer ein solches Pop-Up anzeigen lassen können. Zusätzlich werden wir uns damit beschäftigen, wie wir auf eine bestätigte Berechtigung reagieren und wie wir prüfen können, ob die angeforderte Berechtigung gewährt wurde.

Allgemeine Berechtigungen, wie dem Internetzugriff, dem Akkustatus oder Ähnlichem müssen zwar immer noch in der AndroidManifest-Datei aufgeführt werden, aber ein explizites Pop-Up ist nicht nötig.

Eines Vorweg: Wir müssen nach wie vor alle angeforderten Berechtigungen -egal ob privat oder nicht- in der AndroidManifest-Datei angeben. Dieses PopUp ist lediglich zusätzlich zu bestätigen.

Google möchte dem Nutzer mit dieser neuen Funktion mehr Macht über die Möglichkeiten der Apps geben. Ein MusikPlayer, der ja eigentlich keinen Standort benötigt, kann somit zwangsweise seines Standortes beschnitten werden.

 

Auf Berechtigung prüfen:

Wir sollten uns vielleicht vorerst mit der Prüfung auf Berechtigungen beschäftigen. Lassen wir Android nämlich ein Pop-Up anzeigen, so prüft Android nicht, ob diese Berechtigung bereits gewährt wurde. Ergo würde dieses Pop-Up bei jedem Start angezeigt. Das ist ungünstig.

Prüfen wir, ob Android uns den Zugriff auf den Standort gewährt:

// Dieser Ausdruck gibt uns ein "true" zurück, wenn die Berechtigung "ACCESS_COARSE_LOCATION" gewährt wurde.
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED

// Wir prüfen also:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    // Berechtigung gewährt
}else{
    // Berechtigung NICHT gewährt
}

Die allgemeine Form lautet:

ActivityCompat.checkSelfPermission(this, Manifest.permission.[HIER BERECHTIGUNG EINFÜGEN]) == PackageManager.PERMISSION_GRANTED

Der Ausdruck „[HIER BERECHTIGUNG EINFÜGEN]“ kann beliebig ersetzt werden und entspricht immer dem letzten Rest einer Berechtigung, die auch in der AndroidManifest-Datei aufgeführt werden muss.

 

Nach Berechtigung fragen:

Im nächsten Schritt können wir, bei fehlender Berechtigung, unser Pop-Up anzeigen lassen und uns so die Erlaubnis des Nutzers einholen.

Wichtig wäre zu wissen, dass dieses Pop-Up in einem Asynchronen Thread geöffnet wird. Es ist von unserer App also unabhängig und somit ist es uns nicht möglich direkt nach der Abfrage davon auszugehen, dass die Berechtigung erteilt wurde.

Ein Beispiel zu dem was ich meine:

// Befehl 1
// Befehl 2
// Abfrage
// Pop-Up anzeigen lassen
// Befehl 3, um Berechtigung  zu nutzen (Das ist nicht möglich!!)

Wie wir erfahren können, wann uns die Berechtigung erteilt wurde werden wir gleich lernen.

Vorerst fragen wir nur:

// Nach berechtigung fragen
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);

Achtet darauf, dass die hinten stehende 1 der Index des Pop-Ups ist. Für jede Berechtigung würde ich euch empfehlen einen anderen Index zu nutzen.

 

Auf Bestätigung reagieren:

Schlussendlich müssen wir noch reagieren, wenn der Nutzer eine Wahl getroffen hat.
Wie bereits angesprochen verläuft das Pop-Up asynchron. Zum Glück gibt es allerdings die Möglichkeit eine Funktion in unserem Code zu definieren, wenn ein Pop-Up bestätigt/zurückgewiesen wird.

Übergeben wird an diese Funktion dann der Index, den wir definiert haben (die 1 dort oben), und ein Array, indem drin steht, ob unsere Berechtigung bestätigt oder abgelehnt wurde. Wurde unsere Anfrage bestätigt, so ist in dem Array auch eine Bestätigung enthalten. Ist unsere Anfrage abgelehnt worden, so ist das Array leer.

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] ergebnis) {
    if (requestCode == 1) {
        if (ergebnis.length > 0
            && ergebnis[0] == PackageManager.PERMISSION_GRANTED) {

            // Berechtigung wurde erteilt.
            // Bitte starte hier den oben angesprochenen Befehl 3 (das Beispiel).

        } else {

            // Berechtigung wurde nicht erteilt.

        }
        return;
    }else if([...]){
        // Weitere Abfragen nach Bestätigung (mit Index) folgen hier.
    }
}

 

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

2 Kommentare

*Pflichtfeld

  • Hallo. Danke für die hilfreichen Tutorials!

    Ich frage mich bloß, welche Parameter ich onRequestPermissionsResult() übergeben muss, damit das so klappt, wie oben angeführt..

    Danke schon einmal und viele Grüße!

    • Hallo Tom,
      onRequestPermissionsResult() wird nicht von dir aufgerufen, sondern von Android.
      Dies geschieht nachdem wir …requestPermission(…); aufgerufen und der Nutzer die Pop-Ups abgearbeitet hat.
      Die Parameter sind (der Reihenfolge nach) wie folgt aufgebaut:

      Als erstes kommt eine Zahl zurück, die du zuvor im Aufruf der Funktion …requestPermission(…); definiert hast (letzte Zahl). Diese Zahl hat den Sinn, dass du verschiedene Berechtigungen an verschiedenen Stellen in deiner App erfragen könntest und so in onRequestPermissionsResult() wieder zuordnen. Als Beispiel: WhatsApp fragt bei verschiedenen Aktionen nach der entsprechenden Berechtigung und kann dann mit der einen Funktion onRequestPermissionsResult() alle Stellen an den die Berechtigung eingeholt wird erkennen.

      Als nächstes kommt ein Array mit dem Text der ganzen abgefragten Berechtigungen pro Stelle.
      Wir nehmen an, dass WhatsApp bereits beim Fotos machen nach der Kamera und dem Speicher gefragt hat (ID 1). Nun möchtest du eine Sprachnachricht schicken und WhatsApp würde fragen, ob es Zugriff auf das Mikrofon und den Speicher bekommen könnte (ID 2). Da der Speicher aber bereits genehmigt wurde muss man in onRequestPermissionsResult() nun keine Routine mehr für den Speicher durchlaufen. Eben genau diese Berechitugngsanfragen kommen in diesem Array zurück.

      Das Ergebnis beinhaltet dann ein Array mit den Ergebnissen.
      Da wir variabel Berechtigungen erteilen können und nun nach der Kamera und dem Speicher gefragt wird, wir aber nur den Speicher genehmigt haben würde als Ergebnis an Stelle 0 „false“ stehen und an Stelle 1 „true“, während das Array permissions an Stelle 0 „Kamera“ und an Stelle 1 „Speicher“ stehen hätte.

      Die Kombination aus diesen drei Parametern erlaubt es uns auf jede Eventualität zu reagieren.
      Ich hoffe ich konnte helfen.