Ich dachte, das wäre einfach, aber wie sich herausstellt, ist es leider nicht so.
Was ich habe:
Ich habe einen Ordner namens "myFolder" auf meinem externen Speicher (keine SD-Karte, da es sich um ein Nexus 4 handelt, aber das sollte nicht das Problem sein). Der Ordner enthält einige*.csv
Dateien.
Was ich will:
Ich möchte eine Methode schreiben, die Folgendes bewirkt: Zeigen Sie eine Vielzahl von Apps (Dateibrowsern) an, aus denen ich eine auswählen kann (siehe Bild). Nachdem ich darauf geklickt habe, sollte der ausgewählte Dateibrowser starten und mir den Inhalt von "myFolder" anzeigen. Nicht mehr und nicht weniger.
Meine Frage:
Wie genau mache ich das? Ich glaube, ich bin mit dem folgenden Code ziemlich nahe gekommen, aber egal was ich mache - und ich bin mir sicher, dass es etwas geben muss, das ich noch nicht richtig verstanden habe - es öffnet immer nur den Hauptordner aus dem externen Speicher.
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);
}
Antworten:
Das sollte funktionieren:
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 }
Stellen Sie sicher, dass auf Ihrem Gerät eine Datei-Explorer-App installiert ist.
BEARBEITEN: Die Empfehlung eines Shantanu aus dem Kommentar wurde hinzugefügt.
BIBLIOTHEKEN : Sie können auch die folgenden Bibliotheken unter https://android-arsenal.com/tag/35 einsehen, wenn die aktuelle Lösung Ihnen nicht hilft.
quelle
Ich habe es endlich zum Laufen gebracht. Auf diese Weise werden nur einige Apps von der Auswahl angezeigt (Google Drive, Dropbox, Root Explorer und Solid Explorer). Es funktioniert gut mit den beiden Explorern, aber nicht mit Google Drive und Dropbox (ich denke, weil sie nicht auf den externen Speicher zugreifen können). Der andere MIME-Typ wie
"*/*"
ist ebenfalls möglich.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")); }
quelle
getExternalStorageDirectory()
wurde veraltet. Irgendeine neue Lösung?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(); }
Wenn im obigen Code setDataAndType "* / *" ist, wird ein integrierter Dateibrowser geöffnet, um eine beliebige Datei auszuwählen, wenn "text / plain" festgelegt ist. Dropbox wird geöffnet. Ich habe Dropbox, Google Drive installiert. Wenn ich Dropbox deinstalliere, funktioniert nur "* / *", um den Dateibrowser zu öffnen. Dies ist Android 4.4.2. Ich kann Inhalte von Dropbox und für Google Drive über getContentResolver () herunterladen. OpenInputStream (data.getData ()).
quelle
Der Thread ist alt, aber ich brauchte diese Art von Funktion in meiner Anwendung und habe einen Weg gefunden, dies zu tun. Deshalb habe ich beschlossen, ihn zu veröffentlichen, wenn er jemandem in meiner Situation helfen kann.
Da unsere Geräteflotte nur aus Samsung Galaxy Tab 2 besteht, musste ich nur den Paketnamen des Datei-Explorers finden, den richtigen Pfad angeben und meinen Datei-Explorer erfolgreich dort öffnen, wo ich wollte. Ich wünschte, ich könnte verwenden,
Intent.CATEGORY_APP_FILES
aber es ist nur in API 29 verfügbar.Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.sec.android.app.myfiles"); Uri uri = Uri.parse(rootPath); if (intent != null) { intent.setData(uri); startActivity(intent); }
Wie gesagt, es war einfach für mich, weil unsere Kunden das gleiche Gerät haben, aber es kann anderen helfen, eine Problemumgehung für ihre eigene Situation zu finden.
quelle
Dieser Code funktioniert mit OI File Manager:
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);
Sie können den OI-Dateimanager hier herunterladen: http://www.openintents.org/en/filemanager
quelle
Uri.fromFile(...)
durchUri.parse(...)
- wie in der Frage von OP und der akzeptierten Antwort gezeigt.Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, DocumentsContract.Document.MIME_TYPE_DIR); startActivity(intent);
Öffnet den Startbildschirm der Datei-App
quelle
Hier ist meine Antwort
private fun openFolder() { val location = "/storage/emulated/0/Download/"; val intent = Intent(Intent.ACTION_VIEW) val myDir: Uri = FileProvider.getUriForFile(context, context.applicationContext.packageName + ".provider", File(location)) intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) intent.setDataAndType(myDir, DocumentsContract.Document.MIME_TYPE_DIR) else intent.setDataAndType(myDir, "*/*") if (intent.resolveActivityInfo(context.packageManager, 0) != null) { context.startActivity(intent) } else { // if you reach this place, it means there is no any file // explorer app installed on your device CustomToast.toastIt(context,context.getString(R.string.there_is_no_file_explorer_app_present_text)) } }
Hier, warum ich FileProvider verwendet habe - android.os.FileUriExposedException: file: ///storage/emulated/0/test.txt, das über Intent.getData () über die App hinaus verfügbar gemacht wurde
Ich habe auf diesem Gerät
Geräte getestet : Samsung SM-G950F (dreamltexx), Os API Level: 28
quelle
Heute sollten Sie einen Ordner mit seinem Inhalt darstellen: URI, wie er vom Storage Access Framework abgerufen wurde, und das Öffnen sollte so einfach sein wie:
Intent i = new Intent(Intent.ACTION_VIEW, uri); startActivity(i);
Leider enthält die Datei-App derzeit einen Fehler, der zum Absturz führt, wenn Sie dies über den externen Speicheranbieter versuchen. Auf diese Weise können jedoch Ordner von Drittanbietern angezeigt werden.
quelle
uri
? Ich habe versucht,val filePath = Uri.parse(Environment.DIRECTORY_DOCUMENTS + "/myFolder/")
funktioniert nicht.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(); }
dann müssen Sie nur noch die Antwort hinzufügen
public void onActivityResult(int requestCode, int resultCode, Intent data){ switch (requestCode) { case 0: { //what you want to do //file = new File(uri.getPath()); } } }
quelle
Du scheinst nah dran zu sein.
Ich würde versuchen, den URI so einzustellen:
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);
Aber es unterscheidet sich nicht so sehr von dem, was Sie versucht haben. Sagen Sie uns, ob es etwas ändert?
Stellen Sie außerdem sicher, dass der Zielordner vorhanden ist, und überprüfen Sie das resultierende Uri- Objekt, bevor Sie es an die Absicht senden. Es entspricht möglicherweise nicht unseren Erwartungen.
quelle
uri.toString()
?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 :
filePath :
quelle