Chciałbym rozpocząć poszukiwanie intencji dla aplikacji, które mogą zwracać dowolny rodzaj pliku
Obecnie używam (który skopiowałem z kodu źródłowego e-maila na Androida do pliku załącznika)
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);
Ale pokazuje tylko „Galerię” i „Odtwarzacz muzyki” na moim Galaxy S2. Na tym urządzeniu jest eksplorator plików i chciałbym, aby pojawił się na liście. Chciałbym również, aby aplikacja aparatu była wyświetlana na liście, aby użytkownik mógł zrobić zdjęcie i wysłać je przez moją aplikację. Jeśli zainstaluję menedżera plików Astro, zareaguje również na tę intencję. Moi klienci są tylko właścicielami Galaxy SII i nie chcę zmuszać ich do zainstalowania menedżera plików Astro, biorąc pod uwagę, że mają już podstawowego, ale wystarczającego menedżera plików.
Masz jakiś pomysł, jak mogłem to osiągnąć? Jestem prawie pewien, że widziałem już domyślnego menedżera plików pojawiającego się w takim menu, aby wybrać plik, ale nie pamiętam, w której aplikacji.
źródło
Odpowiedzi:
Nie dla aparatu, ale dla innych plików ...
W moim urządzeniu
ES File Explorer
zainstalowałem i to po prostu działa w moim przypadku ..Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("file/*"); startActivityForResult(intent, PICKFILE_REQUEST_CODE);
źródło
onActivityResult()
- Możesz pobraćUri
plik.PICKFILE_RESULT_CODE
powinno byćPICKFILE_REQUEST_CODE
.Eksplorator plików Samsung wymaga nie tylko niestandardowej akcji ( com.sec.android.app.myfiles.PICK_DATA ), ale również część kategorii (Intent. CATEGORY_DEFAULT ) i typ MIME powinny zostać przekazane jako dodatkowe.
Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA"); intent.putExtra("CONTENT_TYPE", "*/*"); intent.addCategory(Intent.CATEGORY_DEFAULT);
Możesz również użyć tej akcji do otwarcia wielu plików: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE Tak czy inaczej, oto moje rozwiązanie, które działa na Samsungu i innych urządzeniach:
public void openFile(String mimeType) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType(mimeType); intent.addCategory(Intent.CATEGORY_OPENABLE); // special intent for Samsung file manager Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA"); // if you want any file type, you can skip next line sIntent.putExtra("CONTENT_TYPE", mimeType); sIntent.addCategory(Intent.CATEGORY_DEFAULT); Intent chooserIntent; if (getPackageManager().resolveActivity(sIntent, 0) != null){ // it is device with Samsung file manager chooserIntent = Intent.createChooser(sIntent, "Open file"); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent}); } else { chooserIntent = Intent.createChooser(intent, "Open file"); } try { startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show(); } }
U mnie to rozwiązanie dobrze się sprawdza, a może komuś się przyda.
źródło
to działa dla mnie na galaxy note jego kontakty pokazowe, menedżery plików zainstalowane na urządzeniu, galerię, odtwarzacz muzyki
private void openFile(Int CODE) { Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.setType("*/*"); startActivityForResult(intent, CODE); }
tutaj uzyskaj ścieżkę
onActivityResult
działania.protected void onActivityResult(int requestCode, int resultCode, Intent data) { String Fpath = data.getDataString(); // do somthing... super.onActivityResult(requestCode, resultCode, data); }
źródło
To daje mi najlepszy wynik:
Intent intent; if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) { intent = new Intent("com.sec.android.app.myfiles.PICK_DATA"); intent.putExtra("CONTENT_TYPE", "*/*"); intent.addCategory(Intent.CATEGORY_DEFAULT); } else { String[] mimeTypes = {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx "text/plain", "application/pdf", "application/zip", "application/vnd.android.package-archive"}; intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT intent.setType("*/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); }
źródło
Okazuje się, że eksplorator plików Samsung używa niestandardowej akcji. Dlatego podczas wyszukiwania pliku z aplikacji Samsunga mogłem zobaczyć eksplorator plików Samsunga, ale nie z mojego.
Akcja to „com.sec.android.app.myfiles.PICK_DATA”
Stworzyłem niestandardowy selektor działań, który wyświetla działania filtrujące oba intencje.
źródło
Jeśli chcesz to wiedzieć, istnieje biblioteka open source o nazwie aFileDialog, która jest mała i łatwa w użyciu, która zapewnia selektor plików.
Różnica w porównaniu z bibliotekami innego programu do wybierania plików dla systemu Android polega na tym, że aFileDialog daje możliwość otwarcia selektora plików jako okna dialogowego i działania.
Umożliwia także wybieranie folderów, tworzenie plików, filtrowanie plików za pomocą wyrażeń regularnych i wyświetlanie okien dialogowych z potwierdzeniem.
źródło
Pozostałe odpowiedzi nie są błędne. Jednak teraz jest więcej opcji otwierania plików. Na przykład, jeśli chcesz, aby aplikacja miała długotrwały, stały dostęp do pliku, możesz użyć
ACTION_OPEN_DOCUMENT
zamiast tego. Zapoznaj się z oficjalną dokumentacją: Otwórz pliki przy użyciu struktury dostępu do pamięci . Odnieś się również do tej odpowiedzi .źródło