在原生 Android 文件选择器中按 mime 类型或扩展名过滤

Posted

技术标签:

【中文标题】在原生 Android 文件选择器中按 mime 类型或扩展名过滤【英文标题】:Filter by mimetype or extention in native Android file picker 【发布时间】:2016-03-20 21:43:12 【问题描述】:

android 中,可以使用ACTION_OPEN_DOCUMENT Intent 打开本机文件选择器并选择例如.mp4 文件。这是通过使用以下代码将 mime 类型设置为 video/mp4 来实现的:

public static void pickFile(Context mContext, int REQUEST_CODE) 
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("video/mp4");  
        ((Activity) mContext).startActivityForResult(intent, REQUEST_CODE);
    

在我的项目中,我想选择一个自定义扩展文件,其 mime 类型在 android 的 MimeTypeMap 中未知,例如 .qgs 或 .dcm 文件。

为了解决这个问题,我看到了我们迄今为止未能实现的两种可能性:

    ACTION_OPEN_DOCUMENT Intent 中按扩展过滤 向 android 注册一个新的 mime 类型,以便它可以与 ACTION_OPEN_DOCUMENT Intent 一起使用

这些选项中的任何一个是否可行?如何实现? 还是我在没有编写自己的文件选择器的情况下错过了其他方法?

【问题讨论】:

您是否尝试将类型设置为 Application/dicom ?参考this 我尝试将类型设置为Application/dicomApplication/dcmx-lml/x-evm。都是没用的。 @DSlome64 我撤回了您的编辑,因为他们颠倒了问题。我,就像 OP (@Levey) 在使用 ACTION_OPEN_DOCUMENT 时试图过滤文件选择器中显示的文件一样。我没有尝试使用基于 Commonsware 所解释的扩展的意图过滤器 【参考方案1】:

您可以尝试创建自定义文件选择器并传递挂载存储点并递归迭代所有文件类型:

public void scanFiles(File file) 
File[] fileArray = file.listFiles(); 
for (File f : fileArray)
    if (f.isDirectory()) 
      scanFiles(f);
    if (f.isFile() && (f.getpath().endswith("..qgs") || //any extensions)) 
        //Add to your list 
       
    

并使用进程构建器和挂载命令调用 android 中所有挂载点的扫描文件,您可以为希望支持的所有挂载点添加检查。

【讨论】:

【参考方案2】:

可以使用 ACTION_OPEN_DOCUMENT Intent 打开本机文件选择器

这不是“文件选择器”。不要求设备上的每个DocumentsProvider 都提供恰好是文件的文档。

我想选择一个自定义扩展文件,其 mime 类型在 android 的 MimeTypeMap 中未知,例如 .qgs 或 .dcm 文件

不要求设备上的每个DocumentsProvider 都使用具有文件名的文档。您看到的名称是“显示名称”,而对于某些提供者,它们将是文件名,而对于其他提供者,它们可以是提供者想要的任何名称。

这些选项中的任何一个是否可行

没有。

或者在没有编写自己的文件选择器的情况下我错过了其他方法?

如果您想要文件,existing file picker implementations available in libraries 有很多。 ACTION_OPEN_DOCUMENT 适用于您想要处理所有可能的文档源(可移动存储、云提供商等),而不仅仅是文件。

【讨论】:

我有 2 天没有连接,只是错过了赏金到期。我怎样才能将赏金奖励给这个答案? @mbernasocchi:在这一点上,我认为你不能这样做。它是由系统自动授予的。别担心。 :-) 不幸的是,据我所知,所有自定义文件选择器都无法在 Android 11+ 上运行,因为用户无法授予对存储的全局访问权限。所以 SAF ACTION_OPEN_DOCUMENT 是唯一的选项。这使得其有限的 API 和过滤非常痛苦。

以上是关于在原生 Android 文件选择器中按 mime 类型或扩展名过滤的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VS2015 中按名称从解决方案资源管理器中隐藏文件?

404.17请添加显式mime

Android - 获取从文件资源管理器中选择的 .txt 文件的真实路径

如何在 Android 选择器中定义粗体?

在包装器中按图像自动隐藏自动高度和宽度

如何让我的应用出现在应用选择器中?