志在指尖
用双手敲打未来

Android中webview的使用

一、问题:在顶部或许底部重复快速滑动界面,会呈现主动向反方向翻滚,或许视频有声响没有画面。
处理:在AndroidManifest.xml中给webview地点的activity增加硬件加速的特点:android:hardwareAccelerated=”true”。
阐明:1、view控件不能开启硬件加速(webView.setLayerType(View.LAYER_TYPE_HARDWARE,null);这个设置无效),可是view控件能够封闭该view的硬件加速:webView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
2、setLayerType办法只有在api>11才有。
二、webview的设置
WebSettingswebSettings=webView.getSettings();
webSettings.setUseWideViewPort(true);//设置WebView是应该启用对“viewport”HTML元符号的支撑仍是应该使用宽视口。true:支撑标签的viewport特点
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN_MR1){
webSettings.setMediaPlaybackRequiresUserGesture(false);
}
webSettings.setBlockNetworkLoads(false);
webSettings.setAllowContentAccess(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webSettings.setJavaScriptEnabled(true);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
webSettings.setDomStorageEnabled(true);//设置是否启用DOM存储API。默认false。
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN){
webSettings.setAllowUniversalAccessFromFileURLs(true);//能够处理有声响没图画得问题。设置是否答应在文件计划URL上下文中运行的JavaScript拜访来自任何来历的内容。同上。
}
webSettings.setSupportZoom(true);
webSettings.setAllowFileAccess(true);//设置能够拜访文件
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支撑经过JS打开新窗口webSettings.setLoadsImagesAutomatically(true);//支撑主动加载webSettings.setPluginState(WebSettings.PluginState.ON);
三、webview长按下载图片。webview.setOnLongClickListener(newOnLongClickLIstener(){@OverridepublicbooleanonLongClick(Viewview){
intclickType=webview.getHitTestResult().getType();
if(clickType==WebView.HitTestResult.IMAGE_TYPE||clickType==WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE){
Log.d(“webveiw”,”图片url=”+wv.getHitTestResult().getExtra());
}
returnfalse;
}
});
拓宽:WebView.HitTestResult.EDIT_TEXT_TYPE:选中的文字类型;WebView.HitTestResult.PHONE_TYPE:处理拨号;WebView.HitTestResult.EMAIL_TYPE:处理Email;WebView.HitTestResult.GEO_TYPE:地图类型;WebView.HitTestResult.SRC_ANCHOR_TYPE:超链接;WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:带有链接的图片类型;WebView.HitTestResult.IMAGE_TYPE:图片类型;WebView.HitTestResult.UNKNOWN_TYPE:未知类型。四、webview调用原生上传图片,视频,文件等。全局变量:privateValueCallbackmUploadMessage;privateStringacceptTypesStr;privateValueCallbackuploadMessageAboveL;privatestaticfinalintFILE_CAMERA_RESULT_CODE=129;privateFilefileUpFile;第一步:
webview.setWebChromeClient(newWebChromeClient(){//ForAndroid<3.0publicvoidopenFileChooser(ValueCallbackuploadMsg){mUploadMessage=uploadMsg;showImgSeclect();
}//ForAndroid>4.1.1publicvoidopenFileChooser(ValueCallbackuploadMsg,StringacceptType,Stringcapture){acceptTypesStr=acceptType;mUploadMessage=uploadMsg;Log.d(“qtest”,acceptTypesStr);showImgSeclect();
}
//ForAndroid>5.0支撑多张上传
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
publicbooleanonShowFileChooser(WebViewwebView,
ValueCallbackuploadMsg,
WebChromeClient.FileChooserParamsfileChooserParams){
acceptTypesStr=””;
for(Stringstr:fileChooserParams.getAcceptTypes()){
acceptTypesStr+=(TextUtils.isEmpty(acceptTypesStr)?””:”;”)+str;
}
Log.d(“qtest”,acceptTypesStr);
uploadMessageAboveL=uploadMsg;
showImgSeclect();
returntrue;
}
});第二步:
/***显现相机和相册选择*/publicvoidshowImgSeclect(){//留意申请权限:Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE
if(TextUtils.isEmpty(acceptTypesStr))return;IntentcaptureIntent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);if(acceptTypesStr.contains(“image”)){captureIntent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);fileUpFile=newFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+File.separator+”LinAn”+File.separator+”linan-“+System.currentTimeMillis()+”.jpg”);}elseif(acceptTypesStr.contains(“video”)){captureIntent=newIntent(MediaStore.ACTION_VIDEO_CAPTURE);fileUpFile=newFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+File.separator+”LinAn”+File.separator+”linan-“+System.currentTimeMillis()+”.mp4″);}UrimUri=null;if(!fileUpFile.getParentFile().exists()){fileUpFile.getParentFile().mkdirs();}if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){//临时答应captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);mUri=FileProvider.getUriForFile(getContext(),getPackageName()+”.fileprovider”,fileUpFile);}else{mUri=Uri.fromFile(fileUpFile);}//需求显现应用的目的列表,这个list的次序和选择菜单上的图标次序是相关的,请留意。ListcameraIntents=newArrayList();PackageManagerpackageManager=getContext().getPackageManager();//获取手机里一切注册相机接收目的的应用程序,放到目的列表里(无他相机,美颜相机等第三方相机)ListlistCam=packageManager.queryIntentActivities(captureIntent,0);for(ResolveInfores:listCam){StringpackageName=res.activityInfo.packageName;Intenti=newIntent(captureIntent);i.setComponent(newComponentName(res.activityInfo.packageName,res.activityInfo.name));i.setPackage(packageName);i.putExtra(MediaStore.EXTRA_OUTPUT,mUri);cameraIntents.add(i);}//相册选择器Intenti=newIntent(Intent.ACTION_GET_CONTENT);i.addCategory(Intent.CATEGORY_OPENABLE);i.setType(acceptTypesStr.contains(“video”)?”video/*”:acceptTypesStr);//intent选择器IntentchooserIntent=Intent.createChooser(i,”choose”);chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,cameraIntents.toArray(newParcelable[]{}));((CommonWeexActivity)getContext()).startActivityForResult(chooserIntent,FILE_CAMERA_RESULT_CODE);}第三步:
@OverridepublicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);UMShareAPI.get(getContext()).onActivityResult(requestCode,resultCode,data);//qq和新浪的回调if(null==mUploadMessage&&null==uploadMessageAboveL){return;}//没有返回值时的处理if(resultCode!=RESULT_OK){//需求回调onReceiveValue办法防止下次无法呼应js办法if(uploadMessageAboveL!=null){uploadMessageAboveL.onReceiveValue(null);uploadMessageAboveL=null;}if(mUploadMessage!=null){mUploadMessage.onReceiveValue(null);mUploadMessage=null;}return;}Uriresult=null;if(requestCode==FILE_CAMERA_RESULT_CODE){if(null!=data&&null!=data.getData()){result=data.getData();}if(result==null){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){//临时答应result=FileProvider.getUriForFile(getContext(),getPackageName()+”.fileprovider”,fileUpFile);}else{result=Uri.fromFile(fileUpFile);}}//5.0以上设备的数据处理if(uploadMessageAboveL!=null){uploadMessageAboveL.onReceiveValue(newUri[]{result});uploadMessageAboveL=null;}elseif(mUploadMessage!=null){//5.0以下设备的数据处理mUploadMessage.onReceiveValue(result);mUploadMessage=null;}}}
五、webview中的video标签,视频全屏处理。fl_video_full是该界面布局文件中的占满布局的一个FrameLayout控件。
ll_webview是该界面布局文件中占满布局,包括webview。
getHostView().setWebChromeClient(newWebChromeClient(){@OverridepublicvoidonHideCustomView(){try{if(webview.fl_video_full==null)return;webview.ll_webview.setVisibility(View.VISIBLE);webview.fl_video_full.setVisibility(View.GONE);webview.fl_video_full.removeAllViews();webview.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);webview.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}catch(Exceptione){
Log.d(“qtest”,e.toString());
}
super.onHideCustomView();
}
@Override
publicvoidonShowCustomView(Viewview,CustomViewCallbackcallback){
try{
videoFull=view;webview.ll_webview.setVisibility(View.GONE);webview.fl_video_full.setVisibility(View.VISIBLE);webview.fl_video_full.addView(videoFull);webview.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);webview.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);}catch(Exceptione){
Log.d(“qtest”,e.toString());
}
super.onShowCustomView(view,callback);
}
});六、销毁webveiwif(webveiw!=null){
webveiw.loadDataWithBaseURL(null,””,”text/html”,”utf-8″,null);webveiw.clearHistory();((ViewGroup)webveiw.getParent()).removeView(wv);webveiw.destroy();webveiw=null;}七、问题:webview加载https链接会呈现空白页。处理办法:
WebViewClientwebViewClient=newWebViewClient(){
@OverridepublicvoidonReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror){//super.onReceivedSslError(view,handler,error);try{handler.proceed();}catch(Exceptione){}}};阐明:ssl证书过期的话,更新证书需求留意除了服务器端,可能还需求更新DNS,即要更新好每个节点。

未经允许不得转载:IT技术网站 » Android中webview的使用
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载