2015-09-14 11 views
7

Utilizzo Android Storage Access Framework per accedere ad alcuni file su scheda SD. Per me è importante mantenere queste autorizzazioni, essere in grado di modificare i file dopo il riavvio del dispositivo.Storage Access Framework persiste le autorizzazioni non funzionanti

Quindi in base a Storage Access Framework documentation utilizzo le autorizzazioni Persist che consentono all'utente di accedere ai file tramite l'app, anche se il dispositivo è stato riavviato.

Tuttavia, dopo un po 'di tempo ho notato che per alcuni utenti le autorizzazioni venivano in qualche modo revocate. Perché quando sto provando ad usare SAF per scrivere ottengo android.system.ErrnoException: open failed: EACCES (Permission denied) dopo quell'eccezione. Controllo quali permessi ho usando mContext.getContentResolver().getPersistedUriPermissions() tuttavia restituisce la lista vuota. Sono certo che quell'utente mi fornisca le autorizzazioni giuste e che le autorizzazioni siano per la scheda Sd attualmente installata, perché tracciamo queste azioni nel database.

Attualmente, in questo caso sto mostrando il selettore di documenti in modo che l'utente possa fornirmi ancora una volta con nuove autorizzazioni, ma chiedere all'utente di eseguire la stessa azione spesso non è facile da usare.

Cosa può causare la revoca delle autorizzazioni? E come posso evitare questa revoca?

Ho testato su tutti i miei dispositivi più riavvii del telefono, cambiando tempo, rimuovendo l'inserimento della scheda SD, ma non sono riuscito a perdere nessuna delle autorizzazioni di sicurezza.

devo successivo codice per le autorizzazioni che ottengono:

private void openDocumentTree() { 
     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
     intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     startActivityForResult(intent, REQUEST_CODE); 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) { 
      Uri treeUri = data.getData(); 
      final int takeFlags = data.getFlags() & ( 
        Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
      mContext.getContentResolver().takePersistableUriPermission(treeUri, 
        takeFlags); 

        //this is my internal class for saving and restoring tree uri permissions. 
        final Permission permission = Permission.from(treeUri); 
        mPermissionDao.save(permission); 
     } 
    } 
+1

"Io uso Android bagagli Accesso Framework per accedere ad alcuni file su scheda SD" - no, si utilizza SAF con cui lavorare documenti. Se questi documenti sono archiviati dipende dall'utente, non tu. Potrebbero essere gestiti da qualsiasi fornitore (Google Drive, Dropbox, ecc.). "Sono certo che quell'utente mi fornirà le giuste autorizzazioni e che le autorizzazioni sono per la scheda Sd attualmente installata, perché rintraccio queste azioni nel database" - i documenti che l'utente sceglie non devono trovarsi su una scheda SD. "Cosa può causare la revoca delle autorizzazioni?" - forse l'utente ha cancellato il file dal provider. – CommonsWare

+0

Sto usando Saf solo per lavorare con i file sulle schede SD, a causa di specifiche dell'app, c'è solo un motivo per lavorare con il provider di archiviazione esterno. Controllo che l'albero uri sia in formato di memoria esterna. –

+0

Forse l'utente ha cancellato il file dal provider - non è possibile, perché ho ricevuto l'albero uri che rappresenta il percorso di root dell'archiviazione esterna. Non c'è modo di eliminarlo. Inoltre, come ho detto, non ero in grado di creare nuovi file (stava lanciando 'android.system.ErrnoException') e' getContentResolver(). GetPersistedUriPermissions() 'ha restituito la lista vuota. Quindi le autorizzazioni dell'utente in qualche modo revocate. –

risposta

1

È necessario flag addizionali al momento della richiesta ACTION_OPEN_DOCUMENT_TREE.

openDocumentTree dovrebbe essere simile

private void openDocumentTree() { 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
    intent.addFlags(
     Intent.FLAG_GRANT_READ_URI_PERMISSION 
     | Intent.FLAG_GRANT_WRITE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); 
    startActivityForResult(intent, REQUEST_CODE); 
} 

Recensione documentazione per FLAG_GRANT_PERSISTABLE_URI_PERMISSION e FLAG_GRANT_PREFIX_URI_PERMISSION

Problemi correlati