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