Android: Jak otworzyć określony folder za pomocą Intent i pokazać jego zawartość w przeglądarce plików?

Myślałem, że to będzie łatwe, ale jak się okazuje niestety nie jest.

Co mam:

Mam folder o nazwie "myFolder" na mojej pamięci zewnętrznej (nie Karta sd, ponieważ jest to Nexus 4, ale to nie powinno być problemem). Folder zawiera pliki *.csv.

Czego chcę:

Chcę napisać metodę, która wykonuje następujące czynności: Pokaż różne aplikacje (przeglądarki plików), z których mogę wybrać jedną (patrz zdjęcie). Po kliknięciu na nią, wybrana przeglądarka plików powinna się uruchomić i pokazać mi zawartość "myfoldera". Ani więcej, ani mniej.

Tutaj wpisz opis obrazka

Moje pytanie:

Jak mam to zrobić? Myślę, że zbliżyłem się do poniższego kodu, ale bez względu na to, co robię - i jestem pewien, że musi być coś, czego jeszcze nie dostałem-zawsze otwiera tylko główny folder z pamięci zewnętrznej.
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);
}
Author: kaolick, 2013-06-18

8 answers

To powinno zadziałać:

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
}

Upewnij się, że masz zainstalowaną aplikację Eksplorator plików na swoim urządzeniu.

EDIT: dodano rekomendację shantanu z komentarza.

Biblioteki : Możesz również spojrzeć na te biblioteki wyboru plików / katalogów https://android-arsenal.com/tag/35 jeśli obecne rozwiązanie Ci nie pomoże.

 53
Author: Sa Qada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 08:43:37

W końcu to zadziałało. W ten sposób tylko kilka aplikacji jest wyświetlanych przez wybór (Dysk Google, Dropbox, Root Explorer i Solid Explorer). Działa dobrze z dwoma eksploratorami, ale nie z Dyskiem Google i Dropbox (chyba dlatego, że nie mogą uzyskać dostępu do zewnętrznej pamięci masowej). Możliwy jest również inny typ MIME, taki jak "*/*".

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"));
}
 36
Author: kaolick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 13:13:23
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();
}

W kodzie powyżej, jeśli setDataAndType jest "* / * "wbudowana przeglądarka plików jest otwarta, aby wybrać dowolny plik, jeśli ustawiłem" text/plain " Dropbox jest otwarty. Mam zainstalowany Dropbox, Dysk Google. Jeśli odinstaluję Dropbox, tylko "*/*" działa, aby otworzyć przeglądarkę plików. To jest Android 4.4.2. Mogę pobrać zawartość z Dropbox i na Dysk Google, przez getContentResolver ().openInputStream(dane.getData()).

 3
Author: WayneSplatter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-11 09:11:40

Ten kod będzie działał z menedżerem plików 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);

Możesz pobrać OI File manager tutaj: http://www.openintents.org/en/filemanager

 1
Author: Abtin tashakor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-21 06:58:16
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();
}

Następnie wystarczy dodać odpowiedź

public void  onActivityResult(int requestCode, int resultCode, Intent data){

switch (requestCode) {
  case 0: {
     //what you want to do
    //file = new File(uri.getPath());
  }
}
}
 0
Author: Renato Martins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 16:41:42

Dzisiaj powinieneś reprezentować folder używając jego zawartości: URI uzyskanej z frameworka Storage Access, a jego otwarcie powinno być tak proste jak:

Intent i = new Intent(Intent.ACTION_VIEW, uri);
startActivity(i);

Niestety, aplikacja Pliki zawiera obecnie błąd, który powoduje jej awarię podczas próby korzystania z zewnętrznego dostawcy pamięci masowej. Foldery od zewnętrznych dostawców mogą być jednak wyświetlane w ten sposób.

 0
Author: j__m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 13:13:13
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 :

/ mnt / sdcard / Download_Manager_Farsi

 -1
Author: Iman Marashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 23:07:12

Wydajesz się być blisko.

Spróbowałbym ustawić URI tak:

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);
Ale to nie różni się tak bardzo od tego, co próbowałeś. Powiedz nam, czy to coś zmieni ?

Upewnij się również, że folder docelowy istnieje i spójrz na wynikowy Uri obiekt przed wysłaniem go do intent , może to nie być to, czego oczekujemy.

 -1
Author: Guian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 09:16:06