2017-01-13 2 views
1

ich nach einer Möglichkeit, im folgende Szenario laufen Dateien zwischen Anwendungen zu teilen:Freigeben von Dateien zwischen Apps auf Android. Gibt es eine gute Alternative zu ContentProvider?

  • In unserer App gibt es eine Liste von Dateien. Der Benutzer klickt auf die Schaltfläche Teilen, und wir zeigen ihm den Auswahldialog, der eine Liste von Apps anzeigt, die die Datei aufnehmen können. Zum Beispiel kann der Benutzer wählen Google Mail, um den Brief zu erstellen und an diesen Brief ausgewählte Datei anhängen oder Benutzer kann die Datei über Bluetooth übertragen.
  • Die Datei kann in einem privaten Verzeichnis der App sein.
  • Die Datei kann sich an einer beliebigen Stelle im Dateisystem befinden, mit Ausnahme der Verzeichnisse, die Root-Zugriff erfordern.
  • App, die die Datei empfängt, darf keine READ_EXTERNAL_STORAGE Berechtigung haben.
  • Es sollte von API-Ebene 14 und bis zu den neuesten Versionen arbeiten.

Wie ich verstehe, ist der einzige Weg, um alle Bedingungen zu erfüllen, ist die Umsetzung in meinem app individuellen ContentProvider oder FileProvider. Das ContentProvider wird den Inhalts-URI für die Datei geben, und wir fügen diesen URI an die ACTION_SHARE Intent mit der FLAG_GRANT_READ_URI_PERMISSION.

Ich machte mir Sorgen, dass ich einige andere einfache und saubere Lösung verpasst habe. Ob es überhaupt eine andere zuverlässige Alternative zu ContentProvider gibt, und wenn sie existiert, als was ist sie?

+1

Die Verwendung von 'FileProvider' für Ihr Szenario erfordert zwei Zeilen Java-Code, eine vierzeilige XML-Datei und weniger als ein Dutzend Zeilen im Manifest. Wie viel einfacher erwartest du zu bekommen? – CommonsWare

+0

@CommonsWare danke für Ihre vorherige Antwort. Ich habe die FileProvider-Anforderungen nicht näher betrachtet, aber ich habe einige ContentProvider gesehen, die meines Erachtens sehr viel Code benötigen. Mir geht es aber gut, es zu benutzen, habe nur etwas Perfektionistische Neugierde über andere Wege. Entschuldigung, wenn ich mich ärgere. – Dima

+1

Die Implementierung eines 'ContentProvider' ist erschwerend. 'FileProvider' ist bereits implementiert. Entweder du verwendest es direkt oder du unterklassierst es für kleinere Kompatibilitätskorrekturen (z. B. die, die ich verwende, hat eine Drei-Zeilen-Methode, und das ist es). Zugegebenermaßen deckt 'FileProvider' nicht unbedingt alles in Ihrem Szenario ab. Insbesondere haben Sie keine Möglichkeit, 'FileProvider' mit Wechselspeicher zu verwenden, da Sie die Pfade zur Kompilierzeit nicht kennen. – CommonsWare

Antwort

0

Als Ergebnis fand ich eine undokumentierte Funktion in FileProvider, mit der Sie Dateien von überall auf dem Gerät freigeben können. Es ist root-path Element:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <root-path name="my_root"/> 
</paths> 

Wenn root-path Verwendung FileProvider perfekt erfüllt alle meine Anforderungen. Die Implementierung erfordert nur ein Dutzend Zeilen, FileProvider ist eine hervorragende Komponente.

Verwandte Themen