2016-06-20 15 views
2

Ich versuche, den Benutzer zu erhalten, die Ortsgruppe Erlaubnis für meine app mit Cordova hasPermission/requestPermission Methoden zu ermöglichen, aber die Ergebnisse sind verwirrend ...Cordova Laufzeitberechtigungen

Wenn ich rufe hasPermission mit ACCESS_FINE_LOCATION es, gibt immer wahr zurück. Bei Aufruf von Manifest.permission_group.LOCATION wird wahr/falsch zurückgegeben.

Der Aufruf von requestPermission mit Manifest.permission_group.LOCATION zeigt keinen Systemdialog an, daher rufe ich diesen mit ACCESS_FINE_LOCATION an, um den Dialog zu erhalten.

Das Dialogfeld Erlauben aktiviert die Standortgruppenberechtigung für meine App und ruft onRequestPermissionResult mit PackageManager.PERMISSION_GRANTED auf, aber die Schaltfläche Verweigern gibt auch ... GRANTED zurück, wobei die Berechtigung für die Standortgruppe deaktiviert bleibt.

Zur Veranschaulichung hier ist mein aktueller Code:

private void checkPermissions() { 
    if (!cordova.hasPermission(Manifest.permission_group.LOCATION)) { 
     cordova.requestPermission(this, PERMISSION_RUNTIME_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION); 
    } 
} 

@Override 
public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) throws JSONException { 
    if (permissions.length != 1 || grantResults.length != 1 || !Manifest.permission.ACCESS_FINE_LOCATION.equals(permissions[0])) { 
     throw new RuntimeException("Unexpected permission results " + Arrays.toString(permissions) + ", " + Arrays.toString(grantResults)); 
    } 
    int result = grantResults[0]; 
    String action = null; 
    switch (result) { 
     case PackageManager.PERMISSION_DENIED: 
      action = Constants.ACTION_RUNTIME_PERMISSION_DENIED; 
      break; 
     case PackageManager.PERMISSION_GRANTED: 
      action = Constants.ACTION_RUNTIME_PERMISSION_GRANTED; 
      break; 
     default: 
      throw new RuntimeException("Unexpected permission result int " + result); 
    } 

    Intent i = new Intent(action); 
    i.putExtra("permission", Constants.EXTRA_RUNTIME_PERMISSION_NOTIFICATION_ID); 
    getContext().sendBroadcast(i); 
} 

Was ist der richtige Weg, dies zu umgehen? Manchmal scheint die Verwendung einer individuellen Berechtigung und manchmal die Verwendung einer Gruppe mit diesen Methoden nicht richtig - ich würde erwarten, dass dies konsistent ist. Meine Vermutung ist, dass die PERMISSION_GRANTED nach dem DENY-Taste im Dialogfeld gedrückt wird, weil ich eine individuelle Erlaubnis anfordern, die eingeschaltet ist, obwohl die Gruppe ausgeschaltet ist; Gibt es eine Möglichkeit zu erkennen, dass der Benutzer die Anfrage abgelehnt hat?

Ich habe eine Menge Fragen, die im Grunde auf "Wie bekomme ich entweder den Benutzer, um die Standortgruppe Erlaubnis zu aktivieren, wenn es aus ist oder wissen, wann sie ablehnen"?

Wenn es hilft, ist meine android-targetSdkVersion auf 22 eingestellt, und ich verwende Cordova 6.1.1.

Antwort

0

Wenn es hilft, ist meine android-targetSdkVersion auf 22 eingestellt, und ich verwende Cordova 6.1.1.

Android-Laufzeitberechtigungen wurden nur in API eingeführt , also, wenn Ihr Android-targetSdkVersion zu gesetzt, Laufzeitcode Berechtigungen werden immer für jede Erlaubnis dafür zu gewähr, da Berechtigungen erteilt werden zur Installationszeit über das Manifest.

Allerdings, wenn Ihre App ist Anzeige Laufzeitberechtigungen Dialoge, vermute ich, dass Sie gegen API bauen müssen 23 und [email protected]+ für die Android-Plattform.

In Bezug auf Berechtigungsgruppen vs einzelne Berechtigungen, lesen Sie bitte die Android documentation regarding runtime permissions:

Das Dialogfeld vom System angezeigt beschreibt die Berechtigungsgruppe der App den Zugriff auf braucht; Es enthält keine spezifische Berechtigung. Wenn Sie beispielsweise die Berechtigung READ_CONTACTS anfordern, wird im Systemdialogfeld lediglich angegeben, dass Ihre App Zugriff auf die Kontakte des Geräts benötigt. Der Benutzer muss nur einmal für jede Berechtigungsgruppe Berechtigungen erteilen. Wenn Ihre App andere Berechtigungen in dieser Gruppe anfordert (die in Ihrem App-Manifest aufgeführt sind), werden sie vom System automatisch gewährt. Wenn Sie die Berechtigung anfordern, ruft das System die Callback-Methode onRequestPermissionsResult() auf und übergibt PERMISSION_GRANTED, genau so, als ob der Benutzer Ihre Anforderung explizit über das Systemdialogfeld erteilt hätte.

Also in Ihrem Fall anfordernden ACCESS_FINE_LOCATION gewährt den Zugriff auf alle Berechtigungen in der LOCATION Gruppe (Sie können die vollständige Liste der Gruppen und Berechtigungen finden here).

Die Schaltfläche "Ablehnen" gibt auch ... GRANTED zurück, wobei die Berechtigung für die Standortgruppe deaktiviert bleibt.

Dies sollte nicht GRANTED zurückgegeben werden. Wenn die Schaltfläche Verweigern gedrückt wird, wird der Zugriff auf die gesamte Berechtigungsgruppe (einschließlich der angeforderten Berechtigung) verweigert. Die Logik in Ihrem Code-Snippet sieht OK aus, um damit umzugehen, also würde ich den schrittweisen Debugger in Android Studio verwenden, um genau zu sehen, was hier in Ihrem Code passiert.

+0

Ich vermute, die GRANTED Rückgabe von der Schaltfläche Verweigern ist, weil es den API 22-Wert von True für ACCESS_FINE_LOCATION zurückgibt. – Crag

Verwandte Themen