9

In Android 4.4 können Apps aus dem Play Store nur in ihr App-spezifisches Verzeichnis schreiben (zB: /storage/extSdCar/Android/data/com.example.myapp/) und Apps dürfen nur dieses Verzeichnis in micro schreiben SD-Karte. Also erkunde ich die neue SAF-API, um zu überprüfen, ob ich SAF verwenden kann, um auf eine andere Micro-SD-Karte als das anwendungsspezifische Verzeichnis zu schreiben.Löst SAF (Storage Access Framework) das SD-Karten-WRITE-Problem in Android 4.4 (KitKat)?

Ich habe SAF implementiert, indem ich einen Beispielanbieter und eine Client-App erstellt habe. In meinem Provider habe ich versucht, durch die Umsetzung des folgenden Code in queryRoots den gesamten Inhalt der SD-Karte zu zeigen:

row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(new File("/storage/extSdCard"))); 
    row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_RECENTS | Root.FLAG_SUPPORTS_SEARCH); 

ich habe folgende Absicht in meinem Client erstellt und ich bin in der Lage, den gesamten Inhalt der SD-Karte durchsuchen über meinen Provider von System UI von SAF.

Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("*/*"); 
    intent.putExtra(Intent.EXTRA_TITLE, "test.txt"); 
    startActivityForResult(intent, WRITE_REQUEST_CODE); 

Wenn ich auf die Schaltfläche Speichern klicken, erhalte ich einen Toast Fehler „Fehler-Dokument speichern“ .Aber wenn ich auf die App bestimmten Verzeichnis (/storage/extSdCar/Android/data/com.example navigieren. myprovider /) meines Providers in System UI kann ich das Dokument speichern. Auch gibt es keine Absicht wie Intent.CATEGORY_WRITABLE, so dass ich nur Dokumente erhalten kann, die bearbeitet werden können. Bitte helfen Sie mir auf die folgenden Punkte:

1. Es scheint, dass selbst wenn wir SAF verwenden, bleibt die Schreib-Beschränkung auf Micro-SD-Karte gleich. Ist das richtig?

2. Gibt es eine Möglichkeit, dass ich bereits vorhandene Dateien außerhalb meines anwendungsspezifischen Verzeichnisses auf der Micro SD-Karte erstellen oder löschen oder ändern kann?

3. Wer entscheidet über das Flag FLAG_SUPPORTS_WRITE für normale Benutzerdateien wie Fotos, Videos, Musik, Dokumente usw.?

Antwort

3

Wenn Sie eine DocumentsProvider implementieren, können Sie nur den Zugriff auf Dateien auf der Festplatte erweitern, auf die Sie bereits Zugriff haben. Wenn Sie DocumentsProvider hinzufügen, erhalten Sie keinen neuen Zugriff, daher müssen Sie wahrscheinlich keinen implementieren.

Sie können Schreibzugriff überall auf einer SD-Karte erhalten, indem Sie die von Ihnen erwähnten ACTION_OPEN_DOCUMENT oder ACTION_CREATE_DOCUMENT Intents verwenden. In das System ist ein ExternalStorageProvider integriert, der Zugriff auf alle SD-Karten hat, und er wird den Schreibzugriff auf Sie delegieren, sobald er vom Benutzer durch diese Absichten bestätigt wurde.

Benutzer müssen möglicherweise "Einstellungen> Erweiterte Geräte anzeigen" aktivieren, um die von ExternalStorageProvider angebotenen SD-Karten anzuzeigen. Wenn Sie den Benutzer auf die Interaktion mit lokalem Speicher beschränken möchten, können Sie auch EXTRA_LOCAL_ONLY festlegen.

Wie für (2) können Sie neue Dateien außerhalb Ihres paketspezifischen Verzeichnisses mit ACTION_CREATE_DOCUMENT erstellen, und Sie können vorhandene Dateien mit beiden Absichten auswählen. Benutzerdefinierte Dateien können mit DocumentsContract.deleteDocument() gelöscht werden.

Und für (3), MediaDocumentsProvider eingebaut in die Plattform derzeit nicht FLAG_SUPPORTS_WRITE für Fotos, Videos und Musik erweitert.

Hoffe, das hilft. :)

+1

Danke für die Antwort. Gibt es eine Möglichkeit, WRITE-Zugriff auf Dateien auf der Micro-SD-Karte zu erhalten, ohne die System-Benutzeroberfläche von SAF zu starten? Wie können Apps wie der Datei-Manager eine bestimmte Datei auf der Micro-SD-Karte bearbeiten oder löschen, ohne die System-Benutzeroberfläche aufzurufen?Da System UI wieder wie ein Dateibrowser für Dateien ist, wie kann eine Datei-Manager-Anwendung den Vorgang WRITE/DELETE für eine bestimmte Datei ausführen, die sich auf einer Micro-SD-Karte befindet? –

+0

Da das Storage Access Framework den Zugriff auf potenziell vertrauliche Benutzerdaten vermittelt, erfordert es derzeit eine Benutzerbestätigung, bevor Schreibzugriff gewährt wird. Erwähnen Sie in der Datei-Manager-App etwas, das von einem OEM bereitgestellt wird? Integrierte Apps können zusätzliche Berechtigungen verwenden, um direkt auf Geräte zuzugreifen. –

+1

Nein. Es ist keine App vom OEM zur Verfügung gestellt. Es ist eine 3rd Party App im Play Store verfügbar. Es ist mir immer noch unklar, warum diese Einschränkung nur auf microSD-Karte und nicht auf dem internen Speicher implementiert ist. Es wird auch "potentiell sensible Benutzerdaten" im internen Speicher geben und ich frage mich, warum diese Einschränkung nicht auf den internen Speicher angewendet wird. Sehen wir einen Vorteil darin, dass die Schreibbeschränkung nur für die Micro SD-Karte gilt? –

Verwandte Themen