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


72

我以为这很容易,但是事实证明事实并非如此。

是)我有的:

我的外部存储设备上有一个名为“ 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);
}

1
试试一个几乎涵盖了所有的文件扩展名
阿明Maheen

喂伙计!请在此处查看stackoverflow.com/questions/50072638/…并帮助解决类似问题。谢谢!
DmitryBoyko '18

Answers:


69

这应该工作:

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


8
使用此代码可避免未安装应用程序时崩溃。目的选择器= Intent.createChooser(intent,title); //如果(intent.resolveActivity(getPackageManager())!= null){startActivity(chooser); }
shantanu 2015年

1
@shantanu,谢谢您的建议,我添加了一种类似的方法来检查意图的存在。
Ayaz Alifov 2015年

4
这必须标记为答案...诀窍是安装文件资源管理器
。ES

7
嘿,老兄,这仅适用于安装了ES文件浏览器的设备,因为mime'resource / folder'不是标准的mime类型。
杨佳玮

2
实际上,这似乎仅适用于ES File Explorer。让我知道是否存在可与其他资源管理器应用程序一起使用的解决方案。
Shashank Kadne

43

我终于让它工作了。这样,选择器仅显示少数几个应用程序(Google云端硬盘,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"));
}

8
某些应用(例如OI文件管理器)可与此Intent一起使用,但Android的默认文件管理器无法使用此方法。
Ali Behzadian Nejad

2
这只是为我的DropBox工作。您能否提供修改后的代码以在SDcard中打开文件夹。
Suresh Sharma 2013年

1
@SureshSharma您要使用哪个文件浏览器打开SD卡上的文件夹?
kaolick 2013年

这工作正常,但在saumsung电话中它不会重定向到特定文件夹
PriyankaChauhan

getExternalStorageDirectory()已不推荐使用。有什么新解决方案吗?
山姆·陈

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。我安装了Google云端硬盘Dropbox。如果我卸载Dropbox,只有“ * / *”可以打开文件浏览器。这是Android 4.4.2。我可以通过getContentResolver()。openInputStream(data.getData())从Dropbox和Google云端硬盘下载内容。


2

线程很旧,但我在应用程序中需要这种功能,因此我找到了一种方法来实现这一点,因此,我决定发布它,如果它可以对我的情况有所帮助。

由于我们的设备仅由Samsung 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);
  }

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


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


我必须替换Uri.fromFile(...)Uri.parse(...)-如OP的问题和接受的答案所示。
ban-geoengineering

1
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, DocumentsContract.Document.MIME_TYPE_DIR);
startActivity(intent);

将打开文件应用主屏幕 在此处输入图片说明


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()在应用程序之外公开

我在此设备上进行过测试
设备:Samsung SM-G950F(dreamltexx),OS API级别:28


0

今天,您应该使用其内容来表示一个文件夹:从Storage Access Framework获得的URI,并且打开它应该很简单:

Intent i = new Intent(Intent.ACTION_VIEW, uri);
startActivity(i);

las,“文件”应用当前包含一个错误,导致您在使用外部存储提供程序尝试此操作时将其崩溃。但是,可以以这种方式显示来自第三方提供商的文件夹。


如何指定uri?我试过val filePath = Uri.parse(Environment.DIRECTORY_DOCUMENTS + "/myFolder/")不起作用。
山姆·陈

从Storage Access Framework获得的@SamChen此处的关键字。这不适用于文件:URI。
2010年

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

-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对象,这可能不是我们期望的。


1
不,可惜这不会工作。与上面我的代码相同的结果。
kaolick 2013年

在将其发送到意图之前,“ myUri”对象中有什么?
桂安

“ URI中的内容”是什么意思?你是说……uri.toString()吗?
kaolick 2013年


-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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.