6

Multiple-Choice-Frage:Wie RICHTIG überprüfen android Erlaubnis dynamisch

welche der Folge korrekt prüfen, ob eine Anwendung eine gewisse Berechtigung in ihrer AndroidManifest.xml erklärt hat?

getContext().checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 

oder

getContext().getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, getContext().getPackageName()) == PackageManager.PERMISSION_GRANTED 

Grundsätzlich habe ich aus dem Android Dokumentation dessen, was checkCallingOrSelfPermission Ansprüche Angst -> es eine IPC-Berechtigungen erteilt, wenn Sie nur für sie überprüfen ?? was bedeutet das überhaupt? http://developer.android.com/reference/android/content/Context.html#checkCallingOrSelfPermission(java.lang.String)

So eine Erklärung über die wahren Unterschiede wäre genial: D

* Anmerkung: Ich in einer Bibliothek diesen Code gebe, also bin ich erst zur Laufzeit überprüfen Berechtigungen erlaubt, es sei denn Sie eine kennen besserer Weg.

Antwort

3

Sie diese Methode verwenden können:

//for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE" 
public boolean hasPermission(String permission) 
{ 
    try { 
     PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS); 
     if (info.requestedPermissions != null) { 
      for (String p : info.requestedPermissions) { 
       if (p.equals(permission)) { 
        return true; 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 
+0

Dies war ursprünglich meine Antwort für [diese Frage] (http://stackoverflow.com/questions/18236801/programmatically-retrieve-permissions-from-manifest-xml-in-android/18237962 # 18237962). – Phil

4

Von meinem Verständnis (was falsch sein könnte, wie ich mit IPC nicht viel arbeiten, noch):

Da der Code von einem anderen ausgeführt wird Anwendung (z. B. Ihre Bibliothek wurde nicht in die Anwendung kompiliert, aber unter Verwendung Binder o.ä.), können Sie checkCallingPermission verwenden, um zu überprüfen, ob die Anwendung von Drittanbietern die angegebene Berechtigung hat, während checkCallingOrSelfPermission Berechtigungen von der Anwendung enthält Bibliothek wurde in kompiliert.

Sie müssen die Zugriffsberechtigungen getrennt behandeln, da Sie bei der Überprüfung der eigenen Berechtigungen auch Berechtigungen für andere Anwendungen verlieren können. Von der security tips:

Lassen Sie keine Erlaubnis-geschützten Daten. Dies tritt auf, wenn Ihre App Daten über IPC verfügbar macht, die nur verfügbar sind, weil es eine bestimmte Berechtigung hat, aber diese Berechtigung keiner Clients von es ist IPC-Schnittstelle erfordert.

[...]

Wenn eine Schnittstelle bereitstellt, die Zugangskontrollen erfordern, verwenden checkCallingPermission(), um zu überprüfen, ob der Anrufer eine erforderliche Erlaubnis. Dies ist besonders wichtig, bevor Sie auf einen Service unter im Namen des Anrufers zugreifen, da die Identität Ihrer Anwendung an andere Schnittstellen weitergegeben wird.

Der Paket-Manager Art und Weise beschreiben Sie prüft nur die Berechtigungen der Anwendung Ihrer Bibliothek in kompiliert wurde.

Also, wenn Ihr Code nicht von einem anderen Prozess ausgeführt wird, müssen Sie wahrscheinlich nicht über den Unterschied kümmern. Ansonsten, verwenden Sie den Paketmanager Weg oder clear the calling identity stuff, wenn Sie interessiert sind, ob Sie eine Aufgabe ausführen können; Überprüfen Sie zusätzlich die Berechtigungen des Anrufers, wenn Sie überprüfen möchten, ob der aufrufende Prozess auch die Aufgabe ausführen kann.

0

Sie können dafür die Funktion Context.checkCallingorSelfPermission() verwenden. Hier ist ein Beispiel

private boolean checkWriteExternalPermission() 
{ 

    String permission = "android.permission.WRITE_EXTERNAL_STORAGE"; 
    int res = getContext().checkCallingOrSelfPermission(permission); 
    return (res == PackageManager.PERMISSION_GRANTED);    
}