将 fileChooserParams 中的 mime 类型转换为 Intent.setType 的正确格式

2023-12-08

我正在尝试使用 Android 中的 WebView 上传文件。

This is the code in use:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, final ValueCallback<Uri[]> filePathsCallback, final WebChromeClient.FileChooserParams fileChooserParams) {
    Intent intent = fileChooserParams.createIntent();
    LOG.d(LOG_TAG, "mime types: " + Arrays.toString(fileChooserParams.getAcceptTypes()));
    // PRINTS [.jpg,.png,.tiff,.jpeg,.tif,.pdf] !!        
    try {
        parentEngine.cordova.startActivityForResult(new CordovaPlugin() {
            @Override
            public void onActivityResult(int requestCode, int resultCode, Intent intent) {
                // ...
            }
        }, intent, FILECHOOSER_RESULTCODE);
    } catch (ActivityNotFoundException e) {
      // ...
    }
    return true;
}

The problem是当我使用外部库时must use (ng-file-upload) 触发此方法的执行,在 fileChooserParams 中作为参数传递的 mime 类型为:[.jpg,.png,.tiff,.jpeg,.tif,.pdf]。我在其中没有看到其中的大部分内容允许的 mime 类型列表.

结果我在 LogCat 中发现了这个错误:No activity found to handle file chooser intent.: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.GET_CONTENT cat=[android.intent.category.OPENABLE] typ=.jpg,.png,.tiff,.jpeg,.tif,.pdf }

如果我简单地添加intent.setType("image/* application/pdf");一切都按预期进行!

Now the question在里面合并请求我想提交给科尔多瓦安卓的贡献者我如何安全地转换文件选择器参数到正确的格式?


我使用以下代码改进了解决方案:

   // Validation utility for mime types
    private List<String> extractValidMimeTypes(String[] mimeTypes) {
        List<String> results = new ArrayList<String>();
        List<String> mimes;
        if (mimeTypes.length() == 1 && mimeTypes[0].contains(",")) {
            mimes = Arrays.asList(mimeTypes[0].split(","));
        } else {
            mimes = Arrays.asList(mimeTypes);
        }
        MimeTypeMap mtm = MimeTypeMap.getSingleton();
        for (String mime : mimes) {
            if (mime != null && mime.trim().startsWith(".")) {
                String extensionWithoutDot = mime.trim().substring(1, mime.trim().length());
                String derivedMime = mtm.getMimeTypeFromExtension(extensionWithoutDot);
                if (derivedMime != null && !results.contains(derivedMime)) {
                    // adds valid mime type derived from the file extension
                    results.add(derivedMime);
                }
            } else if (mtm.getExtensionFromMimeType(mime) != null && !results.contains(mime)) {
                // adds valid mime type checked agains file extensions mappings
                results.add(mime);
            }
        }
        return results;
    }


public boolean onShowFileChooser(WebView webView, final ValueCallback<Uri[]> filePathsCallback, final WebChromeClient.FileChooserParams fileChooserParams) {
    Intent intent = fileChooserParams.createIntent();
    List<String> validMimeTypes = extractValidMimeTypes(fileChooserParams.getAcceptTypes());
    if (validMimeTypes.isEmpty()) {
        intent.setType(DEFAULT_MIME_TYPE);
    } else {
        intent.setType(String.join(" ", validMimeTypes));
    }
    ...

See my 请求请求更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 fileChooserParams 中的 mime 类型转换为 Intent.setType 的正确格式 的相关文章

随机推荐

  • java.lang.SecurityException:权限拒绝:实现内容提供程序时打开提供程序

    我有问题 我尝试在我的消费者应用程序中实现内容提供程序 这是我来自应用程序 A 提供商 的 Android 清单
  • 以相反顺序打印 bash 参数

    我必须编写一个脚本 它将接受所有参数并反向打印它们 我已经提出了解决方案 但发现它非常糟糕 你有更聪明的主意吗 bin sh gt tekst txt for i in do echo i cat tekst txt gt temp mv
  • spring 3.0 MVC 似乎忽略 messages.properties

    Spring 3 0 MVC 首先 我没有找到任何有关 messages properties 的文档泉源我在各种论坛上发现了有关覆盖错误消息的所有内容 如果有人能参考 messages properties 的记录位置 那就太棒了 也许
  • MVC 3 和 DRY 自定义验证

    除非我遗漏了一些东西 这很有可能 否则在我看来 自定义验证总是违反 DRY 的 在我见过的所有示例中 即使使用 MVC 3 引入的全新非侵入式客户端验证 我们也必须为服务器端验证创建 NET 代码 并为客户端验证创建 jQuery 或 Ja
  • 我应该使用 HTML5 和 CSS3 吗?

    我是一个想要了解最新网络技术的人 但也很感激很多人仍然使用 IE6 7 8 如果一半内容在大多数浏览器上都无法显示 这是浪费代码 时间吗 这只是使用不同样式表的情况 还是只使用一个样式表 如果浏览器不支持文本阴影 那就搞砸了 他们可以看到它
  • 左填充猪中的一根绳子

    我想用 0 s 填充字符串数据类型字段 有什么办法可以做到这一点吗 我需要有固定长度 40 值 提前致谢 千里眼 零的数量需要根据剩余字符串的长度动态生成 所以我认为这在本地猪中是不可能的 这在 UDF 中是很有可能的 输入 txt 111
  • 在 Angular 2 中使用 Typescript 选择输入中的文本

    我正在尝试准确地执行中所描述的操作这个帖子 但是在 Angular2 中 基本上都是使用javascript函数 setSelectionRange start end 在用户单击触发器后的输入中 我找不到任何方法来使用 Typescrip
  • 如何将图片绘制到闭合曲线区域

    你好 我想在 onDraw Canvas canvas 中将图像的一部分绘制到闭合曲线上 我已经使用以下代码绘制了一条闭合曲线 油漆 setColor 颜色 红色 油漆 setAlpha 80 canvas drawPath turnpag
  • C++ #include 未找到

    当我在 Visual Studio Express 中编译 C 程序时 它说找不到atlbase h 我是否缺少一些 SDK 或者其他东西 视觉工作室 2017 When running the Visual Studio Installe
  • 基于表单的网站身份验证的权威指南[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 版主注 这个问题不太适合我们的问答格式话题性规则目前适用于 Stack Overflow 对于内容
  • 如何访问FlipView内DataTemplate内的xaml控件

    我想访问 C 代码中的 图像 元素 我知道我无法直接访问它 因为它位于数据模板中 我已经尝试过视觉树 但仍然无法在代码中获取 图像 控制元素
  • 如何在 VS 负载测试之前设置 JWT 令牌

    我正在尝试运行 Visual Studio 负载测试 但在运行之前 我必须调用登录 webAPI 来生成 JWT 令牌 然后在所有 webAPI Web 测试中使用此令牌 我只需要调用一次登录即可生成令牌 我的所有其他 webAPI 调用中
  • 如何在.NET中不使用乘法运算符来实现乘法[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想在 NET中实现两个整数的乘法而不使用乘法运算符 public uint Multi
  • 写入我的临时文件的权限被拒绝

    我正在尝试使用 Python 在 Windows 操作系统上创建并写入临时文件 我已经使用了Python模块tempfile创建一个临时文件 但是当我去写入临时文件时出现错误Permission Denied 我不允许写入临时文件吗 难道我
  • android.database.sqlite.SQLiteException:靠近“Group”:语法错误(代码1):

    Error Caused by android database sqlite SQLiteException near Group syntax error code 1 while compiling create table Grou
  • C#/Native:使用 SCSI PassThrough 读取 HDD 串行

    我编写了三种利用本机的不同方法CreateFile and DeviceIoControl调用以检索 HDD 序列号 而不是型号 第一个使用S M A R T 第二个使用Storage Query第三个使用SCSI PassThrough
  • JSF 标签未呈现[重复]

    这个问题在这里已经有答案了 我正在启动一个 JSF 项目 这是我第一次使用 JSF 并且在呈现标签时遇到问题 我正在 Eclipse 中进行开发并使用 TomCat 作为服务器 我的login jsp 文件 https gist githu
  • 无法加载包“Microsoft.Net.Native.SharedLibrary-x64”

    我要更新Microsoft NETCore UniversalWindowsPlatform但它显示一个错误 Unable to load package Microsoft Net Native SharedLibrary x64 如果我
  • 为什么在销毁对象后使用该对象时没有收到异常?

    下面的代码工作得很好 但它不应该 当我单击 Button1 时 该对象首先被销毁 然后使用其值 并且我没有收到任何访问冲突或其他内容 更重要的是 乘法运算给出了正确的结果 这证明了Obj1没有被毁掉 但话又说回来 这也不是真的 因为当我关闭
  • 将 fileChooserParams 中的 mime 类型转换为 Intent.setType 的正确格式

    我正在尝试使用 Android 中的 WebView 上传文件 This is the code in use TargetApi Build VERSION CODES LOLLIPOP Override public boolean o