Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将fileChooserParams中的mime类型转换为Intent.setType的正确格式_Java_Android_Ionic Framework_Webview_Filepicker - Fatal编程技术网

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

Java 将fileChooserParams中的mime类型转换为Intent.setType的正确格式,java,android,ionic-framework,webview,filepicker,Java,Android,Ionic Framework,Webview,Filepicker,我正在尝试使用Android中的WebView上传文件 目前正在使用: @TargetApi(Build.VERSION\u CODES.LOLLIPOP) @凌驾 公共布尔onShowFileChooser(WebView WebView,最终值回调FilePathScalBack,最终WebChromeClient.FileChooseParams FileChooseParams){ Intent Intent=fileChooserParams.createIntent(); d(LOG

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

目前正在使用:

@TargetApi(Build.VERSION\u CODES.LOLLIPOP)
@凌驾
公共布尔onShowFileChooser(WebView WebView,最终值回调FilePathScalBack,最终WebChromeClient.FileChooseParams FileChooseParams){
Intent Intent=fileChooserParams.createIntent();
d(LOG_标记,“mime类型:”+Arrays.toString(fileChooserParams.getAcceptTypes());
//打印[.jpg、.png、.tiff、.jpeg、.tif、.pdf]!!
试一试{
parentEngine.cordova.startActivityForResult(新的CordovaPlugin(){
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图){
// ...
}
},intent,FILECHOOSER\u RESULTCODE);
}捕获(ActivityNotFounde异常){
// ...
}
返回true;
}
问题是,当我必须使用的外部库(
ng file upload
)触发此方法的执行时,fileChooserParams中作为参数传递的mime类型是:
[.jpg、.png、.tiff、.jpeg、.tif、.pdf]
。我看不到大多数的照片

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

如果我简单地添加
intent.setType(“image/*application/pdf”)一切正常


现在的问题是:在我想提交给的参与者中,如何安全地将fileChooserParams转换为正确的格式?

我只需在中添加以下两行:

结果:

2019-04-01 00:18:00.501 32500-32500/my.app.bundle.id D/SystemWebChromeClient::fileChooserParams.getAcceptTypes():[.jpg.png.tiff.jpeg.tif.pdf]

2019-04-01 00:18:00.5032225-2921/system_进程I/ActivityManager:START u0{act=android.intent.action.GET_CONTENT cat=[android.intent.category.OPENABLE]typ=image/*cmp=com.android.documentsui/.picker.PickActivity(有附加项)}来自uid 10105


我希望它能被接受。

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

   // 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));
    }
    ...
//mime类型的验证实用程序
私有列表extractValidMimeTypes(字符串[]mimeTypes){
列表结果=新建ArrayList();
列表模拟;
if(mimeTypes.length()==1&&mimeTypes[0]。包含(“,”){
mimes=Arrays.asList(mimeTypes[0].split(“,”);
}否则{
mimes=Arrays.asList(mimeTypes);
}
MimeTypeMap mtm=MimeTypeMap.getSingleton();
for(字符串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)){
//添加从文件扩展名派生的有效mime类型
结果。添加(derivedMime);
}
}else if(mtm.getExtensionFromMimeType(mime)!=null&&!results.contains(mime)){
//在文件扩展名映射中添加有效的mime类型检查
结果:添加(mime);
}
}
返回结果;
}
公共布尔onShowFileChooser(WebView WebView,最终值回调FilePathScalBack,最终WebChromeClient.FileChooseParams FileChooseParams){
Intent Intent=fileChooserParams.createIntent();
List validmitypes=extractValidmitypes(fileChooserParams.getAcceptTypes());
if(validimetypes.isEmpty()){
setType(默认的MIME类型);
}否则{
setType(String.join(“,validmitypes));
}
...

有关更多详细信息,请参阅my。

我切换到了其他解决方案,因为这强制选择器将图像作为第一选择。在其他Cordova应用程序(如音乐选择器)中可能存在问题。
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, fileChooserParams.getAcceptTypes());
   // 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));
    }
    ...