gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:29:32 26 4
gpt4 key购买 nike

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

这是the code使用中:

@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]。我在 list of allowed mime types 中没有看到其中的大部分内容。 .

因此我在 LogCat 中发现此错误:找不到处理文件选择器 Intent 的 Activity 。:android.content.ActivityNotFoundException:找不到处理 Intent 的 Activity { act=android.intent.action.GET_CONTENT cat=[android.intent.category.OPENABLE]typ=.jpg ,.png,.tiff,.jpeg,.tif,.pdf }

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

现在问题是:在Merge Request中我想提交给 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));
}
...

查看我的Pull Request了解更多详情。

关于java - 将 fileChooserParams 中的 mime 类型转换为 Intent.setType 的正确格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55447711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com