Android: Wie öffne ich einen bestimmten Ordner über Intent und zeige seinen Inhalt in einem Dateibrowser an?

72

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.

Geben Sie hier die Bildbeschreibung ein

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);
}
Kaolick
quelle
1
Versuchen Sie dieses deckt fast jede Dateierweiterung ab
Ameen Maheen
Hallo Mann! Schauen Sie sich hier stackoverflow.com/questions/50072638/… an und helfen Sie bei der Lösung ähnlicher Probleme . Vielen Dank!
DmitryBoyko

Antworten:

69

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.

Ayaz Alifov
quelle
8
Verwenden Sie diesen Code, um einen Absturz zu vermeiden, wenn keine Anwendung installiert ist. Intent chooser = Intent.createChooser (Absicht, Titel); // Überprüfen Sie, ob die Absicht in mindestens eine Aktivität aufgelöst wird, wenn (intent.resolveActivity (getPackageManager ())! = Null) {startActivity (Auswahl); }
Shantanu
1
@shantanu, danke für Ihre Empfehlung. Ich habe eine ähnliche Methode hinzugefügt, um das Vorhandensein einer Absicht zu überprüfen.
Ayaz Alifov
4
Dies muss als Antwort markiert werden ... Der Trick besteht darin, einen Datei-Explorer zu installieren. Der Datei-Explorer hat für mich funktioniert, aber nicht für den OI-Dateimanager ...
thilina c
7
Hey Mann, das funktioniert nur auf Geräten, auf denen der ES-Datei-Explorer installiert ist, da die MIME 'Ressource / Ordner' kein Standard-MIME-Typ ist.
Jiawei Yang
2
Dies scheint in der Tat nur mit ES File Explorer zu funktionieren. Lassen Sie mich wissen, ob es eine Lösung gibt, die mit anderen Explorer-Apps funktioniert.
Shashank Kadne
43

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"));
}
Kaolick
quelle
8
Einige Apps wie der OI-Dateimanager funktionieren mit dieser Absicht, aber der Standard-Dateimanager von Android funktioniert mit dieser Methode nicht.
Ali Behzadian Nejad
2
Dies funktioniert nur für DropBox für mich. Können Sie bitte einen geänderten Code zum Öffnen von Ordnern auf der SD-Karte angeben?
Suresh Sharma
1
@SureshSharma Welchen Dateibrowser möchten Sie zum Öffnen von Ordnern auf Ihrer SD-Karte verwenden?
Kaolick
Dies funktioniert gut, aber in Saumsung Telefon wird es nicht zu einem bestimmten Ordner umgeleitet
PriyankaChauhan
getExternalStorageDirectory()wurde veraltet. Irgendeine neue Lösung?
Sam Chen
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();
}

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

WayneSplatter
quelle
2

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_FILESaber 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.

Jackyto
quelle
1

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

Abtin Tashakor
quelle
Ich musste ersetzen Uri.fromFile(...)durch Uri.parse(...)- wie in der Frage von OP und der akzeptierten Antwort gezeigt.
Ban-Geoengineering
1
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, DocumentsContract.Document.MIME_TYPE_DIR);
startActivity(intent);

Öffnet den Startbildschirm der Datei-App Geben Sie hier die Bildbeschreibung ein

Kreker
quelle
1

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

Sudo Ajay
quelle
0

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.

j__m
quelle
Wie spezifiziere ich das uri? Ich habe versucht, val filePath = Uri.parse(Environment.DIRECTORY_DOCUMENTS + "/myFolder/")funktioniert nicht.
Sam Chen
@SamChen, wie es vom Storage Access Framework erhalten wurde, sind hier die Schlüsselwörter. Dies funktioniert nicht mit Datei: URIs.
j__m
-1
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());
  }
}
}
Renato Martins
quelle
-2

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.

Guian
quelle
1
Nein, das funktioniert leider NICHT . Gleiches Ergebnis wie bei meinem obigen Code.
Kaolick
Was ist in dem 'myUri'-Objekt, bevor es an die Absicht gesendet wird?
Guian
Was meinst du mit "Was ist in der URI"? Meinst du etw wie uri.toString()?
Kaolick
Hallo! Bitte werfen Sie einen Blick auf die ähnliche Frage stackoverflow.com/questions/50072638/…
DmitryBoyko
-3
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

Iman Marashi
quelle