当前位置: 首页 > 面试题库 >

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

闻人景澄
2023-03-14
问题内容

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

这是使用的代码:

@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;
}

问题 是,当外部库,我 必须 使用(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");一切都将按预期工作!

现在的 问题 是:在我要提交给cordova-android的贡献者的合并请求中,如何安全地将 fileChooserParams
转换为正确的格式? __


问题答案:

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

   // 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));
    }
    ...

有关更多详细信息,请参见我的请求请求。



 类似资料:
  • 我试图上传一个文件使用WebView在Android。 现在的问题是:在我要提交给Cordova-Android贡献者的合并请求中,我如何安全地将fileChooserParams转换为正确的格式?

  • 问题内容: 我知道如何获取mysql行并将其转换为json: 但: 数据库行具有不同的类型,例如int,float,string。通过使用json_encode()进行转换,所有结果都是字符串。 有没有比这更好的方法来更正类型: 我想遍历键并添加0,因为: 第一个编码规则:干-不要重复自己 但我不能,因为: 行还具有数字以外的其他类型(字符串,日期) 有很多列 设计在开发人员中,因此列名经常更改

  • 问题内容: 我从“ reflect”包中的函数调用获取此返回值: 。 想知道我是否可以在返回值内访问实际地图,如果可以,怎么办? 编辑: 因此,这是我在进行返回Value对象的调用的地方。它返回`[< map[string]string Value ][< map[string]string Value >]`为常规地图。 问题答案: 使用方法可以将大多数反射对象转换回一个值。 获取此值后,可以将

  • 问题内容: 有人可以给我解释一下我该如何转换 2009-10-27 14:36:59.580250 进入 27.10.2009,14:36 ? 第一个日期可以作为字符串使用,而第二个日期也可以作为字符串;)到目前为止,我还不太了解Java中的日期转换… 提前致谢! 问题答案: 您可以为此使用。第一步是根据第一个字符串的模式将第一个字符串解析为一个对象。下一步是根据第二个字符串的模式将获取的对象格式

  • 我试图检测传递给web服务到SOAP信封中的文件内容类型。可以通过两种方式指示该文件: 从其url, 从其包含(base64压缩数据)。 那么,如何在文件扩展名未知的情况下检测MIME类型呢?

  • 我目前在转换张量流时遇到问题。pb模型到TFlite格式。我目前正在遵循谷歌代码实验室的指示,错误说 Traceback(最近调用的最后一次):文件/usr/local/bin/tflite_convert,第5行,在tensorflow.lite.python.tflite_convert导入主重要错误:没有模块命名lite.python.tflite_convert 我正在使用谷歌提供的命令