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 52

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