6

domanda a scelta multipla:Come controllare CORRETTAMENTE permesso Android dinamicamente

che del follow sarà correttamente verificare se un'applicazione ha un certo consenso dichiarato nella loro AndroidManifest.xml?

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

o

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

In sostanza, ho avuto paura dalla documentazione Android di ciò che checkCallingOrSelfPermission pretese -> concede un permesso IPC se basta controllare per questo ?? Che cosa vuol dire, anche? http://developer.android.com/reference/android/content/Context.html#checkCallingOrSelfPermission(java.lang.String)

Così alcuna spiegazione sulle vere differenze sarebbe fantastico: D

* nota: io do questo codice in una libreria, quindi sono solo permesso di verificare le autorizzazioni in fase di esecuzione, a meno che non si sa di un modo migliore.

risposta

3

È possibile utilizzare questo metodo:

//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

In origine era la mia risposta per [questa domanda] (http://stackoverflow.com/questions/18236801/programmatically-retrieve-permissions-from-manifest-xml-in-android/18237962 # 18.237.962). – Phil

4

Dalla mia comprensione (che potrebbe essere sbagliato, come non ho lavorato molto con IPC, ancora):

Dato che il codice viene eseguito da un altro applicazione (ad es. la libreria non è stata compilata nell'applicazione, ma è stata esposta a terzi utilizzando Binder o qualcosa del genere), è possibile utilizzare checkCallingPermission per verificare se l'applicazione di terzi ha l'autorizzazione concessa, mentre checkCallingOrSelfPermission include le autorizzazioni dall'applicazione la biblioteca è stata compilata

È necessario gestire le autorizzazioni del chiamante separatamente in quanto si potrebbero perdere permessi ad altre applicazioni quando si controllano anche le proprie autorizzazioni. Da security tips:

Non perdete dati protetti da autorizzazione. Ciò si verifica quando l'app espone i dati su IPC che è disponibile solo perché ha un'autorizzazione specifica , ma non richiede l'autorizzazione di alcun client di dell'interfaccia IPC.

[...]

Se fornendo un'interfaccia che non richiede controlli di accesso, utilizzare checkCallingPermission() per verificare se il chiamante ha richiesto permesso. Questo è particolarmente importante prima di accedere a un servizio per conto del chiamante, dato che l'identità della tua applicazione viene passata alle altre interfacce .

Il modo di gestione dei pacchetti si descrivono i controlli solo le autorizzazioni dell'applicazione tua libreria è stata compilata in.

Quindi, se il codice non viene eseguito da un altro processo, probabilmente non devi preoccuparti della differenza. Altrimenti, utilizzare il modo gestore pacchetti o clear the calling identity stuff se si è interessati a se è possibile eseguire un'attività; controllare inoltre le autorizzazioni del chiamante se si desidera verificare se il processo chiamante potrebbe eseguire anche l'attività.

0

Per questa funzione è possibile utilizzare la funzione Context.checkCallingorSelfPermission(). Ecco un esempio

private boolean checkWriteExternalPermission() 
{ 

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