2013-06-18 4 views
44

Ich dachte, das wäre einfach, aber wie sich herausstellt, ist es leider nicht.Android: Wie öffnet man einen bestimmten Ordner über Intent und zeigt seinen Inhalt in einem Dateibrowser an?

Was ich habe:

Ich habe einen Ordner „myFolder“ auf meinem externen Speicher (SD-Karte nicht, weil es ein Nexus 4 ist, aber das sollte nicht das Problem sein) genannt. Der Ordner enthält einige *.csv Dateien.

Was ich will:

Ich möchte ein Verfahren schreiben, die die folgende tut: Zeigen Sie eine Vielzahl von Anwendungen (Dateibrowser), von dem ich ein (siehe Bild) auswählen können. Nachdem ich darauf geklickt habe, sollte der ausgewählte Dateibrowser starten und mir den Inhalt von "myFolder" anzeigen. Nicht mehr und nicht weniger.

enter image description here

Meine Frage:

Wie genau kann ich das tun? Ich denke, ich kam mit dem folgenden Code ziemlich nah, aber egal was ich tue - und ich bin mir sicher, dass es etwas geben muss, das ich noch nicht richtig verstanden habe - es öffnet immer nur den Hauptordner vom 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); 
} 
+0

Versuchen Sie [diese] (http://Stackoverflow.com/a/38650471/3836137) deckt man fast jede Dateiendung –

+0

Bitte akzeptieren Sie eine Antwort, die Ihnen hilft .. oder Ihre Antwort .. –

+1

@RanjithKumar I verstehe nicht. Ich habe schon vor langer Zeit meine eigene Antwort gepostet und akzeptiert (siehe unten). – kaolick

Antwort

37

Ich habe es endlich funktioniert. Auf diese Weise werden nur wenige Apps in 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, sie können nicht auf den externen Speicher zugreifen). 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")); 
} 
+14

das funktioniert nicht für mich –

+6

Einige Anwendungen wie OI-Datei-Manager arbeiten mit dieser Absicht, aber Android Standard-Datei-Manager funktioniert nicht mit dieser Methode. –

+1

Dies funktioniert nur für DropBox für mich. Können Sie bitte modifizierten Code zum Öffnen von Ordnern in SD-Karte geben. –

0

Sie scheinen nah zu sein.

Ich würde versuchen, den URI wie folgt festgelegt:

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 ist nicht so verschieden von dem, was Sie versucht haben. Erzähl uns, wenn es etwas ändert?

Auch stellen Sie sicher, dass die Zielordner vorhanden ist, und haben einen Blick auf die resultierende Uri Objekt, bevor es dem Absicht zu senden, kann es nicht sein, was wir zu erwarten sind.

+0

Nein, leider funktioniert das ** NICHT **. Das gleiche Ergebnis wie bei meinem obigen Code. – kaolick

+0

Was ist im 'myUri' Objekt, bevor es an die Absicht gesendet wird? – Guian

+0

Was meinst du mit "was ist in der URI"? Meinst du etw wie 'uri.toString()'? – kaolick

0

dieser Code mit OI File Manager arbeiten:

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

können Sie OI File Manager hier: http://www.openintents.org/en/filemanager

+0

Ich musste ersetzen 'Uri.fromFile (...)' mit 'Uri.parse (...)' - als gezeigt in der Frage des OP und der angenommenen Antwort. –

47

Diese Arbeit sollte:

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 
} 

Bitte, sein Vergewissern Sie sich, dass auf Ihrem Gerät eine Datei-Explorer-App installiert ist.

EDIT: eine Shantanu Empfehlung aus dem Kommentar hinzugefügt.

+6

Verwenden Sie diesen Code, um einen Absturz zu vermeiden, wenn keine Anwendung installiert ist. Intent chooser = Intent.createChooser (Absicht, Titel); // Sicherstellen, dass die Absicht in mindestens eine Aktivität aufgelöst wird if (intent.resolveActivity (getPackageManager())! = Null) { startActivity (chooser); } – shantanu

+3

Dies sollte als die Antwort –

+0

@shantanu markiert werden, danke für Ihre Empfehlung, fügte ich eine ähnliche Methode, um das Vorhandensein einer Absicht zu überprüfen. –

-1
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

0
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 brauchen Sie nur die Antwort

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

switch (requestCode) { 
    case 0: { 
    //what you want to do 
    //file = new File(uri.getPath()); 
    } 
} 
} 
oben
2
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(); 
} 

In Code hinzufügen, wenn setDataAndType ist "*/*" eine eingebaute Dateibrowser eine beliebige Datei auswählen geöffnet wird, wenn ich "text/plain" einstelle, wird Dropbox geöffnet. Ich habe Dropbox, Google Drive installiert. Wenn ich Dropbox deinstalliere, funktioniert nur "*/*" um den Dateibrowser zu öffnen. Das ist Android 4.4.2. Ich kann Inhalte von Dropbox und für Google Drive von getContentResolver() herunterladen. OpenInputStream (data.getData()).