公司有个业务需求,需要在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版权协议,转载请附上原文出处链接和本声明。