2015-09-14 7 views
7

Ich verwende Android Storage Access Framework auf einige Dateien auf SD-Karte zugreifen. Es ist wichtig für mich, diese Berechtigungen zu erhalten, um Dateien nach dem Neustart des Geräts bearbeiten zu können.Storage Access Framework persistent Berechtigungen funktioniert nicht

So nach Storage Access Framework documentation Ich benutze Persist Berechtigungen, die den Benutzer weiterhin Zugriff auf die Dateien über Ihre App, auch wenn das Gerät neu gestartet wurde.

Aber nach einiger Zeit bemerkte ich, dass für einige Benutzer Berechtigungen irgendwie widerrufen wurden. Weil, wenn ich versuche, SAF zum Schreiben zu verwenden, ich android.system.ErrnoException: open failed: EACCES (Permission denied) nach dieser Ausnahme bekomme, überprüfe ich, welche Berechtigungen ich unter Verwendung mContext.getContentResolver().getPersistedUriPermissions() habe, aber es leere Liste zurückbringen. Ich bin sicher, dass der Benutzer mir die richtigen Berechtigungen und Berechtigungen für die derzeit installierte SD-Karte zur Verfügung stellen, da ich diese Aktionen in der Datenbank verfolgen.

Momentan zeige ich in diesem Fall die Dokumentauswahl, so dass der Benutzer mich noch einmal mit neuen Berechtigungen versorgen kann, aber der Benutzer wird oft aufgefordert, die gleiche Aktion auszuführen, ist nicht benutzerfreundlich.

Was kann zum Entzug von Berechtigungen führen? Und wie kann ich diesen Widerruf verhindern?

Ich habe auf allen meinen Geräten mehrere Neustarts des Telefons getestet, Zeit geändert, Entfernen von SD-Karte, konnte aber keine Sicherheitsberechtigungen verloren.

Ich habe für den Erhalt Berechtigungen nächsten Code:

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

aussehen sollte „Ich benutze Android Speicherzugriffsrahmen einige Dateien auf der SD-Karte zugreifen“ - nein, Sie SAF verwenden, mit zu arbeiten Unterlagen. Ob diese Dokumente gespeichert werden, hängt vom Benutzer ab, nicht von Ihnen. Sie können von jedem Anbieter verwaltet werden (Google Drive, Dropbox usw.). "Ich bin mir sicher, dass dieser Benutzer mir die richtigen Berechtigungen zur Verfügung stellt und dass die Berechtigungen für die aktuell installierte SD-Karte gelten, da ich diese Aktionen in der Datenbank nachverfolge" - die Dokumente, die der Benutzer auswählt, müssen sich nicht auf einer SD-Karte befinden. "Was kann zum Entzug von Berechtigungen führen?" - Vielleicht hat der Benutzer die Datei vom Provider gelöscht. – CommonsWare

+0

Ich benutze Saf nur, um mit Dateien auf den SD-Karten zu arbeiten, wegen der spezifischen App gibt es nur einen Grund, mit dem externen Speicheranbieter zu arbeiten. Ich überprüfe, dass Baum uri im Format des externen Speichers ist. –

+0

Vielleicht hat der Benutzer die Datei vom Provider gelöscht - es ist nicht möglich, weil ich die Baumuri erhalten habe, die den Stammpfad des externen Speichers darstellt. Es gibt keine Möglichkeit, es zu löschen. Wie bereits erwähnt, konnte ich keine neuen Dateien erstellen (es wurde 'android.system.ErrnoException' geworfen) und' getContentResolver(). GetPersistedUriPermissions() 'gab eine leere Liste zurück. So hat der Benutzer Berechtigungen irgendwie widerrufen. –

Antwort

1

Sie zusätzliche Flags benötigen, wenn ACTION_OPEN_DOCUMENT_TREE anfordern.

openDocumentTree wie

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); 
} 

Bewertung docs für FLAG_GRANT_PERSISTABLE_URI_PERMISSION und FLAG_GRANT_PREFIX_URI_PERMISSION

Verwandte Themen