84

我认为这很容易,但不幸的是事实并非如此。

是)我有的:

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

我想要的是:

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

在此处输入图像描述

我的问题:

我该怎么做?我想我非常接近以下代码,但无论我做什么 - 我确信肯定有一些我还没有做对的东西 - 它总是只打开外部存储中的主文件夹。

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

11 回答 11

76

这应该可以帮助您:

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
}

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

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

:如果当前的解决方案对您没有帮助,您还可以查看以下库https://android-arsenal.com/tag/35 。

于 2014-10-30T11:30:13.690 回答
47

我终于让它工作了。这样,选择器仅显示少数应用程序(Google Drive、Dropbox、Root Explorer 和 Solid Explorer)。两个浏览器都可以正常工作,但 Google Drive 和 Dropbox 不行(我猜是因为他们无法访问外部存储)。其他类似的 MIME 类型"*/*"也是可能的。

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"));
}
于 2013-06-18T16:01:11.463 回答
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();
}

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

于 2015-12-11T08:24:24.197 回答
3

线程很旧,但我需要在我的应用程序中使用这种功能,并且我找到了一种方法来做到这一点,所以我决定发布它,如果它可以帮助我遇到的任何人。

由于我们的设备群仅由三星 Galaxy Tab 2 组成,我只需要找到文件资源管理器的包名,给出正确的路径,然后我就可以成功打开我想要的文件资源管理器。我希望我可以使用Intent.CATEGORY_APP_FILES,但它仅在 API 29 中可用。

  Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.sec.android.app.myfiles");
  Uri uri = Uri.parse(rootPath);
  if (intent != null) {
      intent.setData(uri);
      startActivity(intent);
  }

正如我所说,这对我来说很容易,因为我们的客户拥有相同的设备,但它可以帮助其他人找到适合自己情况的解决方法。

于 2020-05-14T09:50:56.563 回答
1

此代码将与 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);

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

于 2013-07-21T06:58:16.910 回答
1
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, DocumentsContract.Document.MIME_TYPE_DIR);
startActivity(intent);

将打开文件应用主屏幕在此处输入图像描述

于 2020-03-15T15:47:52.480 回答
1

这是我的答案

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

这就是我使用 FileProvider 的原因 - android.os.FileUriExposedException: file:///storage/emulated/0/test.txt 通过 Intent.getData() 暴露在应用程序之外

我在此设备上测试
设备:三星 SM-G950F (dreamltexx),操作系统 API 级别:28

于 2020-12-01T04:27:05.923 回答
0

今天,你应该使用它的内容来表示一个文件夹:从存储访问框架获得的 URI,打开它应该很简单:

Intent i = new Intent(Intent.ACTION_VIEW, uri);
startActivity(i);
于 2018-09-03T13:13:13.153 回答
-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();
}

那么你只需要添加响应

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

switch (requestCode) {
  case 0: {
     //what you want to do
    //file = new File(uri.getPath());
  }
}
}
于 2015-12-10T15:21:55.857 回答
-2

你似乎很亲近。

我会尝试像这样设置 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);

但这与您尝试过的并没有太大不同。告诉我们它是否改变了什么?

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

于 2013-06-18T10:21:08.887 回答
-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);

完整文件名

/mnt/sdcard/Download_Manager_Farsi/preview.png

文件路径

/mnt/sdcard/Download_Manager_Farsi

于 2015-05-07T23:07:12.280 回答