我最近项目需求加入文档云 根据后台返回的数据直接返回iframe标签,但是Android这边想用webview加载,中间出现过各种问题还好最终解决了。所以就整理出一下的代码自己做个笔记同时也希望对您有帮助!
直接上关键性的代码:
这是接口返回的iframe标签 (这是一个动态的PPT的文本,后台可以简单的定一下样式) <iframe src='http://s2.sgld.org/op/embed.aspx?src=http://s1.sgld.org:9191/d6ada647-9ed4-4b5b-b632-e94aa03f5694.pptx' frameborder='0' width='100%px' height='100%px'></iframe> public static WebView pptWeb(Context context,WebView webview,String iframe,final ProgressBar pb){ WebSettings webSettings = webview.getSettings(); // 设置WebView属性,能够执行Javascript脚本 webSettings.setJavaScriptEnabled(true); webSettings.setPluginState(PluginState.ON);// 可以使用插件 // 设置用户代理(请求头)使得web端正确判断 webview.getSettings().setUserAgentString( "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" + "; dccPlan/1.5.8.30"); // "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" + "; dccPlan/1.5.8.30"
//1.5.8.30 改成自己项目的版本号 webview.setBackgroundColor(0);//这点可以防止有白边 // 设置可以访问文件 webSettings.setAllowFileAccess(true); // 设置支持缩放 webSettings.setBuiltInZoomControls(true); webSettings.setUseWideViewPort(true);// 设置此属性,可任意比例缩放 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setUseWideViewPort(true); webSettings.setDefaultTextEncodingName("utf-8"); webSettings.setLoadWithOverviewMode(true); webSettings.setSupportZoom(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setAllowFileAccess(true); webSettings.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS); webSettings.setBlockNetworkImage(true); webSettings.setSupportMultipleWindows(true); webSettings.setDisplayZoomControls(false); webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);//不加上,会显示白边 webview.setVerticalScrollBarEnabled(false); webview.setHorizontalScrollBarEnabled(false); //设置 缓存模式 webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 开启 DOM storage API 功能 webSettings.setDomStorageEnabled(true); // webview.setWebChromeClient(new WebChromeClient()); // 安卓5.0 WebView 使用WebRTC, 调用摄像头与麦克风时的许可 webview.setWebChromeClient(new WebChromeClient() { // ---WebRTC: @Override public void onPermissionRequest(PermissionRequest request) { request.grant(request.getResources()); } @Override public void onProgressChanged(WebView view, int newProgress) { // TODO 自动生成的方法存根 pb.setProgress(newProgress);// 设置进度值 } }); // webSettings.getUserAgentString(); // 设置Web视图 webview.setWebViewClient(new webViewClient()); webSettings.setAppCacheEnabled(true); // 考虑到网页的加载速度,我们可以调用setWebChromeClient()方法 // 滚动条在整个page里 webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); if (!TextUtils.isEmpty(iframe)) { String url = "<html>"+iframe+"</html>"; webview.loadData(url, "text/html", "utf-8"); } return webview; } public static class webViewClient extends WebViewClient { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false;//返回false } @Override public void onPageFinished(WebView view, String url) { view.getSettings().setBlockNetworkImage(false); super.onPageFinished(view, url); } public void onPageStarted(WebView view, String url) { super.onPageStarted(view, url, null); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // 不要使用super,否则有些手机访问不了,因为包含了一条 handler.cancel() super.onReceivedSslError(view, handler, error); // 接受所有网站的证书,忽略SSL错误,执行访问网页 handler.proceed(); } }