2014-12-19 33 views
9

Chcę użyć okna systemu Android w ramach Storage Access Framework do otwarcia pliku. Czynię to zKto może pokazać innym dostawcom z ACTION_OPEN_DOCUMENT

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

a następnie obsługiwać wracającą URI w onActivityResult().

Problem polega na tym, że w menu wynikowym otrzymuję znacznie mniej dostawców treści, niż się spodziewałem. Tylko Dysk Google i Pliki do pobrania (patrz lewy zrzut ekranu poniżej). Inne, takie jak Dropbox, Solid Explorer, ... nie są wyświetlane.

Podejrzewam, że powodem jest to, że te aplikacje po prostu nie ustawiają odpowiedniego filtru intencyjnego, aby pojawił się na tej liście.

Jednak inne aplikacje, na przykład Poczta Kaiten lub Chrome, w jakiś sposób wyświetlają okno dialogowe systemu z w pełni zaimplementowanymi dostawcami treści u góry listy, a następnie inne, takie jak Dropbox i Solid Explorer, poniżej, rozdzielone cienką pasek (patrz prawy zrzut ekranu).

Jak mogę uzyskać to zachowanie?

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

+0

Zobacz, co pokazuje się w LogCat kiedy powoływać Kaiten Mail dokument Chooser. Lub [zainstaluj App Browser] (https://play.google.com/store/apps/details?id=com.japanesecrackers.appbrowser) i zobacz, co mają inne aplikacje w swoich elementach '' może brakować w twoim. Czy jesteś pewien, że jest to "dialog systemowy", a nie praca, która miesza efekty "ACTION_OPEN_DOCUMENT" i "ACTION_GET_CONTENT" czy coś takiego? – CommonsWare

+3

Spoglądając na [kod źródłowy] (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: chromium & type = cs) Chrom (ium) raz może faktycznie zobaczyć, że zachowanie po prawej stronie jest wytwarzane przez stosunkowo prosty "Intent.ACTION_GET_CONTENT". To smutne, że pierwotnie dobry pomysł na strukturę dostępu do pamięci wydaje się tak źle obsługiwany przez praktycznie wszystkie aplikacje, że jest zasadniczo bezużyteczny ... – cgogolin

+0

Myślę, że na przykład Dropbox musi implementować SAF. Według mojej wiedzy nie popierają tego. – powder366

Odpowiedz

2

Użyj „ACTION_GET_CONTENT:

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