Android: Как открыть определенную папку с помощью Intent и показать ее содержимое в файловом браузере?
Я думал, что это будет легко, но, как выясняется, к сожалению это не так.
что у меня есть:
у меня есть папка под названием "myFolder" на моем внешнем накопителе (не sd-карта, потому что это Nexus 4, но это не должно быть проблемой). Папка содержит некоторые *.csv
файлы.
что хочется:
Я хочу написать метод, который делает следующее: показать различные приложения (файловые браузеры), из которых я могу выбрать один (см. рисунок). После того, как я нажму на него, выбранный файловый браузер должен запуститься и показать мне содержимое "myFolder". Ни больше ни меньше.
мой вопрос:
как именно мне это сделать? Я думаю, что я подошел довольно близко со следующим кодом, но независимо от того, что я делаю - и я уверен, что должно быть что - то, что я еще не понял, - он всегда открывает только основную папку из внешнего хранилища.
public void openFolder()
{
File file = new File(Environment.getExternalStorageDirectory(),
"myFolder");
Log.d("path", file.toString());
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setDataAndType(Uri.fromFile(file), "*/*");
startActivity(intent);
}
8 ответов:
Это должно работать:
Uri selectedUri = Uri.parse(Environment.getExternalStorageDirectory() + "/myFolder/"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(selectedUri, "resource/folder"); if (intent.resolveActivityInfo(getPackageManager(), 0) != null) { startActivity(intent); } else { // if you reach this place, it means there is no any file // explorer app installed on your device }
пожалуйста, убедитесь, что на вашем устройстве установлено приложение File explorer.
EDIT: добавлена рекомендация Шантану из комментария.
библиотеки: Вы также можете посмотреть на эти библиотеки выбора файлов/каталоговhttps://android-arsenal.com/tag/35 если текущее решение вам не поможет.
Я наконец-то получил его работу. Таким образом, только несколько приложений отображаются с помощью выбора (Google Drive, Dropbox, Root Explorer и Solid Explorer). Он отлично работает с двумя исследователями, но не с Google Drive и Dropbox (я думаю, потому что они не могут получить доступ к внешнему хранилищу). Другой тип MIME, как
"*/*"
тоже возможно.public void openFolder(){ Intent intent = new Intent(Intent.ACTION_GET_CONTENT); Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath() + File.separator + "myFolder" + File.separator); intent.setDataAndType(uri, "text/csv"); startActivity(Intent.createChooser(intent, "Open folder")); }
Intent chooser = new Intent(Intent.ACTION_GET_CONTENT); Uri uri = Uri.parse(Environment.getDownloadCacheDirectory().getPath().toString()); chooser.addCategory(Intent.CATEGORY_OPENABLE); chooser.setDataAndType(uri, "*/*"); // startActivity(chooser); try { startActivityForResult(chooser, SELECT_FILE); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show(); }
в коде выше, если setDataAndType -"*/*", встроенный файловый браузер открывается для выбора любого файла, если я установил "text / plain", открывается Dropbox. У меня установлен Dropbox, Google Диск. Если я удалю Dropbox только "* / * " работает, чтобы открыть браузер файлов. Это Android 4.4.2. Я могу скачать содержимое из Dropbox и для Google Диска, с помощью getContentResolver().openInputStream(данные.метод GetData.))(
этот код будет работать с файловым менеджером OI:
File root = new File(Environment.getExternalStorageDirectory().getPath() + "/myFolder/"); Uri uri = Uri.fromFile(root); Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setData(uri); startActivityForResult(intent, 1);
вы можете получить файловый менеджер OI здесь:http://www.openintents.org/en/filemanager
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("text/csv"); intent.addCategory(Intent.CATEGORY_OPENABLE); try { startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), 0); } catch (android.content.ActivityNotFoundException ex) { ex.printStackTrace(); }
тогда вам просто нужно добавить ответ
public void onActivityResult(int requestCode, int resultCode, Intent data){ switch (requestCode) { case 0: { //what you want to do //file = new File(uri.getPath()); } } }
сегодня вы должны представлять папку, используя ее содержимое: URI, полученный из структуры доступа к хранилищу, и открыть его должно быть так же просто, как:
Intent i = new Intent(Intent.ACTION_VIEW, uri); startActivity(i);
увы, приложение Files в настоящее время содержит ошибку, которая приводит к сбою при попытке этого с помощью внешнего поставщика хранилища. Папки от сторонних поставщиков, однако, могут отображаться таким образом.
File temp = File.createTempFile("preview", ".png" ); String fullfileName= temp.getAbsolutePath(); final String fileName = Uri.parse(fullfileName) .getLastPathSegment(); final String filePath = fullfileName. substring(0,fullfileName.lastIndexOf(File.separator)); Log.d("filePath", "filePath: " + filePath);
fullfileName:
/mnt / sdcard/Download_Manager_Farsi / preview.png
путь к файлу:
/mnt / sdcard / Download_Manager_Farsi
Вы, кажется, близки.
Я бы попытался установить URI следующим образом:
String folderPath = Environment.getExternalStorageDirectory()+"/pathTo/folder"; Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); Uri myUri = Uri.parse(folderPath); intent.setDataAndType(myUri , "file/*"); startActivity(intent);
но это не так уж отличается от того, что вы пробовали. Скажите нам, если это что-то изменит ?
также убедитесь, что целевая папка существует, и посмотрите на результат Uri