Android WebView支持input file启用相机/选取照片功能
webview要调起input-file拍照或者选取文件功能,可以在webview.setWebChromeClient方法中重写指定的方法,来拦截webview的input事件,并做我们相应的操作。
Android代码
webView.setWebChromeClient(newWebChromeClient(){
@Override
publicvoidonProgressChanged(WebViewview,intnewProgress){
if(newProgress==100){
progressBar.setVisibility(View.GONE);//加载完网页进度条消失
}else{
progressBar.setProgress(newProgress);//设置进度值
progressBar.setVisibility(View.VISIBLE);//开始加载网页时显示进度条
}
}
/**
*8(Android2.2)<=API<=10(Android2.3)回调此方法
*/
privatevoidopenFileChooser(android.webkit.ValueCallbackuploadMsg){
Log.e("WangJ","运行方法openFileChooser-1");
//(2)该方法回调时说明版本API<21,此时将结果赋值给mUploadCallbackBelow,使之!=null
mUploadCallbackBelow=uploadMsg;
takePhoto();
}
/**
*11(Android3.0)<=API<=15(Android4.0.3)回调此方法
*/
publicvoidopenFileChooser(android.webkit.ValueCallbackuploadMsg,StringacceptType){
Log.e("WangJ","运行方法openFileChooser-2(acceptType:"+acceptType+")");
//这里我们就不区分input的参数了,直接用拍照
openFileChooser(uploadMsg);
}
/**
*16(Android4.1.2)<=API<=20(Android4.4W.2)回调此方法
*/
publicvoidopenFileChooser(android.webkit.ValueCallbackuploadMsg,StringacceptType,Stringcapture){
Log.e("WangJ","运行方法openFileChooser-3(acceptType:"+acceptType+";capture:"+capture+")");
//这里我们就不区分input的参数了,直接用拍照
openFileChooser(uploadMsg);
}
/**
*API>=21(Android5.0.1)回调此方法
*/
@Override
publicbooleanonShowFileChooser(WebViewwebView,ValueCallbackvalueCallback,FileChooserParamsfileChooserParams){
Log.e("WangJ","运行方法onShowFileChooser");
//(1)该方法回调时说明版本API>=21,此时将结果赋值给mUploadCallbackAboveL,使之!=null
mUploadCallbackAboveL=valueCallback;
takePhoto();
returntrue;
}
});
这里的java代码是来拦截input事件的,里面做了很多api版本的判断,不同版本的api调用不同的方法,下面是一些其他方法:
调起相机/选择文件的方法:takePhoto();
/**
*调用相机
*/
privatevoidtakePhoto(){
//指定拍照存储位置的方式调起相机
StringfilePath=Environment.getExternalStorageDirectory()+File.separator
+Environment.DIRECTORY_PICTURES+File.separator;
StringfileName="IMG_"+DateFormat.format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA))+".jpg";
imageUri=Uri.fromFile(newFile(filePath+fileName));
//Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
//intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
//startActivityForResult(intent,REQUEST_CODE);
//选择图片(不包括相机拍照),则不用成功后发刷新图库的广播
//Intenti=newIntent(Intent.ACTION_GET_CONTENT);
//i.addCategory(Intent.CATEGORY_OPENABLE);
//i.setType("image/*");
//startActivityForResult(Intent.createChooser(i,"ImageChooser"),REQUEST_CODE);
IntentcaptureIntent=newIntent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
IntentPhoto=newIntent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
IntentchooserIntent=Intent.createChooser(Photo,"ImageChooser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,newParcelable[]{captureIntent});
startActivityForResult(chooserIntent,REQUEST_CODE);
}
onActivityResult回调:
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==REQUEST_CODE){
//经过上边(1)、(2)两个赋值操作,此处即可根据其值是否为空来决定采用哪种处理方法
if(mUploadCallbackBelow!=null){
chooseBelow(resultCode,data);
}elseif(mUploadCallbackAboveL!=null){
chooseAbove(resultCode,data);
}else{
Toast.makeText(this,"发生错误",Toast.LENGTH_SHORT).show();
}
}
}
其他一些方法:
/**
*AndroidAPI<21(Android5.0)版本的回调处理
*@paramresultCode选取文件或拍照的返回码
*@paramdata选取文件或拍照的返回结果
*/
privatevoidchooseBelow(intresultCode,Intentdata){
Log.e("WangJ","返回调用方法--chooseBelow");
if(RESULT_OK==resultCode){
updatePhotos();
if(data!=null){
//这里是针对文件路径处理
Uriuri=data.getData();
if(uri!=null){
Log.e("WangJ","系统返回URI:"+uri.toString());
mUploadCallbackBelow.onReceiveValue(uri);
}else{
mUploadCallbackBelow.onReceiveValue(null);
}
}else{
//以指定图像存储路径的方式调起相机,成功后返回data为空
Log.e("WangJ","自定义结果:"+imageUri.toString());
mUploadCallbackBelow.onReceiveValue(imageUri);
}
}else{
mUploadCallbackBelow.onReceiveValue(null);
}
mUploadCallbackBelow=null;
}
/**
*AndroidAPI>=21(Android5.0)版本的回调处理
*@paramresultCode选取文件或拍照的返回码
*@paramdata选取文件或拍照的返回结果
*/
privatevoidchooseAbove(intresultCode,Intentdata){
Log.e("WangJ","返回调用方法--chooseAbove");
if(RESULT_OK==resultCode){
updatePhotos();
if(data!=null){
//这里是针对从文件中选图片的处理
Uri[]results;
UriuriData=data.getData();
if(uriData!=null){
results=newUri[]{uriData};
for(Uriuri:results){
Log.e("WangJ","系统返回URI:"+uri.toString());
}
mUploadCallbackAboveL.onReceiveValue(results);
}else{
mUploadCallbackAboveL.onReceiveValue(null);
}
}else{
Log.e("WangJ","自定义结果:"+imageUri.toString());
mUploadCallbackAboveL.onReceiveValue(newUri[]{imageUri});
}
}else{
mUploadCallbackAboveL.onReceiveValue(null);
}
mUploadCallbackAboveL=null;
}
privatevoidupdatePhotos(){
//该广播即使多发(即选取照片成功时也发送)也没有关系,只是唤醒系统刷新媒体文件
Intentintent=newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(imageUri);
sendBroadcast(intent);
}
相关的全局变量:
privateandroid.webkit.ValueCallbackmUploadCallbackAboveL; privateandroid.webkit.ValueCallback mUploadCallbackBelow; privateUriimageUri; privateintREQUEST_CODE=1234;
总结
以上所述是小编给大家介绍的AndroidWebView支持inputfile启用相机/选取照片功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!