Подтвердить что ты не робот

Android: Как открыть конкретную папку через Intent и показать ее содержимое в файловом браузере?

Я думал, что это будет легко, но, как оказалось, к сожалению это не так.

Что у меня:

У меня есть папка с именем myFolder на моем внешнем хранилище (не SD-карта, потому что это Nexus 4, но это не должно быть проблемой). Папка содержит несколько файлов *.csv.

Что я хочу:

Я хочу написать метод, который делает следующее: Показать множество приложений (файловых браузеров), из которых я могу выбрать один (см. рисунок). После того, как я нажму на него, нужно запустить выбранный браузер файлов и показать мне содержимое "myFolder". Больше не меньше.

enter image description here

Мой вопрос:

Как именно я это делаю? Я думаю, что я пришел довольно близко к следующему коду, но независимо от того, что я делаю, и я уверен, что должно быть что-то, чего я еще не получил, - он всегда открывает только основную папку из внешнего хранилища.

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);
}
4b9b3361

Ответ 1

Наконец-то я начал работать. Таким образом, выбирает только несколько приложений (Google Диск, Dropbox, Root Explorer и Solid Explorer). Он отлично работает с двумя исследователями, но не с Google Диском и 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"));
}

Ответ 2

Это должно работать:

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
}

Пожалуйста, убедитесь, что на вашем устройстве установлено приложение-проводник.

EDIT: добавлена ​​рекомендация shantanu из комментария.

Ответ 3

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 (data.getData()).

Ответ 4

Вы близки.

Я бы попытался установить 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, прежде чем отправить его в намерение, возможно, это не то, что мы ожидаем.

Ответ 5

этот код будет работать с файловым менеджером 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

Ответ 6

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());
  }
}
}

Ответ 7

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

filePath:

/шоссе/SDCard/Download_Manager_Farsi