2014-12-19 2 views
9

Ich möchte den Android-System-Dialog als Teil des Storage Access Framework zum Öffnen einer Datei verwenden. Ich tue dies mitWer mehr Anbieter mit ACTION_OPEN_DOCUMENT zeigen

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
intent.addCategory(Intent.CATEGORY_OPENABLE); 
intent.setType("application/pdf"); 
startActivityForResult(intent, EDIT_REQUEST); 

und dann die zurückgegebene URI in onActivityResult() behandeln.

Das Problem ist, dass ich in dem resultierenden Menü viel weniger Content-Provider als erwartet bekomme. Nur Google Drive und Downloads (siehe linker Screenshot unten). Andere, wie Dropbox, Solid Explorer, ... werden nicht angezeigt.

Ich vermute, der Grund ist, dass diese Apps einfach nicht den erforderlichen Intent-Filter einstellen, der in dieser Liste erscheint.

Andere Anwendungen, zum Beispiel Kaiten Mail oder Chrome, schaffen es irgendwie, den Systemdialog mit vollständig implementierten Inhaltsanbietern am Anfang der Liste zu zeigen und dann andere, wie Dropbox und Solid Explorer, unten durch ein dünnes getrennt Bar (siehe den rechten Screenshot).

Wie kann ich dieses Verhalten erhalten?

Comparison of the behavior I get (left) and the one I want (right)

+0

Sehen Sie, was in LogCat zeigt sich, wenn Sie Kaiten Post des Dokuments Chooser aufzurufen. Oder, [App-Browser installieren] (https://play.google.com/store/apps/details?id=com.japanesecrackers.appbrowser) und sehen Sie, was die anderen Apps in ihren '' Elementen haben kann in deinem fehlen. Sind Sie sicher, dass dies der "Systemdialog" ist, und kein Workalike, das die Ergebnisse "ACTION_OPEN_DOCUMENT" und "ACTION_GET_CONTENT" mischt? – CommonsWare

+3

Ein Blick in den [Quellcode] (https://code.google.com/p/chromium/codesearch#chromium/src/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java&q= Intent.CATEGORY_OPENABLE & sq = package: chrom & type = cs) von Chrom (ium) kann einmal sehen, dass das Verhalten auf der rechten Seite durch ein relativ einfaches 'Intent.ACTION_GET_CONTENT' erzeugt wird. Es ist ein bisschen traurig zu sehen, dass die ursprünglich gute Idee des Storage-Access-Frameworks von so gut wie allen Apps so schlecht unterstützt wird, dass es praktisch nutzlos ist ... – cgogolin

+0

Ich denke zum Beispiel, dass Dropbox SAF implementieren muss. Soweit ich weiß, unterstützen sie das nicht. – powder366

Antwort

2

Use ‚ACTION_GET_CONTENT:

Intent intent = new Intent(Intent. ACTION_GET_CONTENT); 
intent.setType("application/pdf"); 
startActivityForResult(intent, EDIT_REQUEST);