Android Webview 调起系统相机、相册

公司有个业务需求,需要在H5页中可以分别调起相同中的相机、相册。拿到该H5页看了一下,H5中调起相机和打开相册的源码分别是:

#调起相机
<input type="file" accept="image/*" capture="camera"/>

#打开相册
<input type="file" accept="image/*" multiple="multiple"/>

从这两个代码分析出打开相机可能用到capture属性,打开相册中的multiple属性应该是表示可以选择多张图片。在Android Webview中,当type为file的<input>标签被点击时,WebChromClient中的onShowFileChooser方法将被回调,因此,打开相册或者调起系统相机的业务逻辑可以从这里开始。

public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams);

接下来,分析一下这个方法,怎样才能知道何时打开相册,何时调起相机。

这个方法只有3个参数,分别是

webview:这个就不用说了;

filePathCallback:回调接口,返回选择到的文件Uri。注意,只有当onShowFileChooser返回true时才调用这个回调接口;

fileChooserParams:描述文件选择的模式和用到的一些可选项;

因此,可以知道H5中<input>标签的一些属性值应该可以从fileChooserParams中获取得到;再跟踪FileChooserParams这个抽象类,里面提供了一下方法:

public static Uri[] parseResult(int resultCode, Intent data);

public abstract int getMode();

public abstract String[] getAcceptTypes();

public abstract boolean isCaptureEnabled();

public abstract CharSequence getTitle();

public abstract String getFilenameHint();

public abstract Intent createIntent();

到这里,我们就应该可以知道怎样区分出何时调起相机,何时打开相册了;看下demo:

webView.setWebChromeClient(new WebChromeClient(){
            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                Intent intent = fileChooserParams.createIntent();
                if (fileChooserParams != null){
                    if (fileChooserParams.isCaptureEnabled()){
                        //todo 打开相机
                        return true;
                    }
                    //打开图库或者其他文件选择
                    String[] mimeTypes = fileChooserParams.getAcceptTypes();
                    if (mimeTypes != null && mimeTypes.length > 0){
                        intent.setType("*/*");
                    }else {
                        intent.setType(mimeTypes[0]);
                    }
                }else {
                    intent.setType("*/*");
                }
                
                startActivityForResult(intent, 100);
                return true;
            }
        });

 


版权声明:本文为wangjippp原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。