Android中目录的MIME类型

12

我想知道是否可以启动一个Intent来使用文件浏览器(如果设备上已安装)查看目录,以便像这样打开一个文件夹:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/MyFolder");
intent.setDataAndType(uri, "MIME TYPE FOR FOLDERS");
startActivity(intent);

1
据我所知,文件夹没有 MIME 类型。 - fredley
2
有没有线索可以打开一个已经安装的文件浏览器中的文件夹?谢谢。 - Pedriyoo
6个回答

10

这是一个古老的问题,但我注意到在任何答案中MimeType目录实际上都没有被正确指定。我在Google SAF(存储访问框架)的代码示例android-StorageProvider中找到了这个问题。

DocumentsContract.Document.MIME_TYPE_DIR

这是哪个字符串:

vnd.android.document/directory

所以针对最初的问题:

    Uri uri = Uri.parse(getFilesDir().getPath());
    int OPEN_REQUEST = 1337;
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setDataAndType(uri, DocumentsContract.Document.MIME_TYPE_DIR);

    startActivityForResult(intent, OPEN_REQUEST);

但是存储访问框架将为您浏览目录。因此,您可能只需要执行以下操作:

    int OPEN_REQUEST = 1337;
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("*/*");

    startActivityForResult(intent, OPEN_REQUEST);

3
根据官方文献(docs),它是vnd.android.cursor.dir/*

1
我认为MIME类型与操作无关。 - Archibald
我尝试了一下,但应用程序强制关闭了,这是错误日志:"java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.gallery3d/com.android.gallery3d.app.GalleryActivity}: java.lang.ClassCastException: com.android.gallery3d.data.UriImage cannot be cast to com.android.gallery3d.data.MediaSet" - HendraWD
我正在使用CyanogenMod 12.1-YOG4PAS1N0,Android版本号为5.1.1。 - HendraWD
这对我有用。此外,我能够使用vnd.android.cursor.dir/image,使目录打开到图库应用程序中,而不是让用户在图库|文件浏览器|等之间选择。在虚拟Nexus 10上运行Android KitKat。 - Bob Liberatore
记录一下,代码如下: final File dir = getSaveImageDir(); final Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(dir), "vnd.android.cursor.dir/image"); startActivity(intent); - Bob Liberatore
最后,这个答案解释了为什么这样可以工作。 - Bob Liberatore

3

AndExplorer具有供应商MIME类型,可将其用作文件选择器:

  • vnd.android.cursor.dir/lysesoft.andexplorer.director
  • vnd.android.cursor.dir/lysesoft.andexplorer.file

有关更多信息,请参见AndExplorer的开发人员文档。我认为其他文件浏览器也有类似的功能,但我尚未找到它们的文档。


没有必要为此指定特定的应用程序。请参见此答案,以获取更好、更通用的解决方案:https://dev59.com/ZG445IYBdhLWcg3wq8FY#31725812 - Bob Liberatore

3

根据一些谷歌搜索结果,字符串“inode/directory”和“x-directory/normal”似乎是Unix系统中预设的MIME类型,但我手机上没有找到任何关于它们的信息,所以我可能会先检查并提供这些类型;而寻找值不绑定到特定应用程序的“vnd.android.cursor.item/directory”则是其次选择。

我不太愿意使用应用程序特定类型。

(我刚发现ES使用“resource/folder”,这也可以是独立于应用程序的类型;可惜没有办法告诉Android这些类型都是等效的。)


好的,看起来Cyanogen文件管理器(com.cyanogenmod.filemanager)也使用了它。 - HendraWD

2

Blackmoon文件浏览器根据MIME类型做出响应:

  • vnd.android.cursor.item/file

以便打开它的视图,从而显示文件夹的内容或者在文件情况下,将其父文件夹滚动显示以显示特定文件。

您可以查看Blackmoon的开发文档,其中概述了它使用的各种意图。

很遗憾,Android没有指定特定的MIME类型来查看文件/文件夹。这样,所有文件管理应用程序都将使用相同的意图,以便用户可以自由选择最适合他们的应用程序,而不是被锁定在任何特定应用程序中。

我想这就是为什么存在http://www.openintents.org/这样的网站,以便开发人员可以共享一些标准或至少发布一些标准应用程序功能。


-1

由于目录文件似乎没有标准的 MIME 类型,因此我编写了我的文件浏览器以过滤没有 MIME 类型的意图。只需将数据设置为您文件夹的 Uri 即可。这也将意图方案设置为“file”,这是我的意图过滤器所必需的。

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/MyFolder");
intent.setData(uri);
startActivity(intent);

这个意图将启动以下应用程序:

http://play.google.com/store/apps/details?id=com.organicsystemsllc.thumbdrive


1
但是如果用户的手机没有安装该应用程序,它将会失败。我尝试在我的手机上,它只显示了Drive PDF Viewer和SQLiteViewer。 - HendraWD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接