Android:如何通过Intent打开特定文件夹并在文件浏览器中显示其内容?

我认为这很容易,但事实certificate,事实并非如此。

我拥有的:

我有一个名为“我的文件夹”在我的外部存储(不SD卡,因为它是一个Nexus 4,但不应该是这个问题)。 该文件夹包含一些*.csv文件。

我想要的是:

我想写一个方法,执行以下操作:显示各种应用程序(文件浏览器),我可以从中select一个(请参见图片)。 点击它后,选定的文件浏览器应该启动并显示“myFolder”的内容。 不多不less。

在这里输入图像描述

我的问题:

我到底怎么做? 我想我已经和下面的代码非常接近了,但是不pipe我做了什么 – 而且我确定一定有一些我没有正确的做法 – 它总是只从外部存储打开主文件夹。

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

这应该工作:

 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 } 

请确保您的设备上安装了任何文件资源pipe理器应用程序。

编辑:从评论中添加shantanu的build议。

我终于搞定了。 通过这种方式,select器(Google Drive,Dropbox,Root Explorer和Solid Explorer)只显示几个应用程序。 这两个浏览器工作正常,但不是与谷歌驱动器和Dropbox(我猜是因为他们无法访问外部存储)。 其他MIMEtypes,如"*/*"也是可能的。

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

在上面的代码中,如果setDataAndType是“* / *”,打开一个内置文件浏览器来select任何文件,如果我设置“text / plain”,Dropbox打开。 我安装了Dropbox,Google Drive。 如果我卸载Dropbox只“* / *”的作品打开文件浏览器。 这是Android 4.4.2。 我可以通过getContentResolver(),从Dropbox和Google Drive下载内容。openInputStream(data.getData())。

此代码将与OI文件pipe理器一起使用:

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

你可以在这里获得OI文件pipe理器: http : //www.openintents.org/en/filemanager

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

那么你只需要添加响应

 public void onActivityResult(int requestCode, int resultCode, Intent data){ switch (requestCode) { case 0: { //what you want to do //file = new File(uri.getPath()); } } } 

你看起来很近

我会尝试设置这样的URI:

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

但是这与你所尝试的没有什么不同。 告诉我们,如果它改变了什么?

还要确保目标文件夹存在,然后查看生成的Uri对象,然后将其发送到意图 ,这可能不是我们所期望的。

 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 / SD卡/ Download_Manager_Farsi