前言
app中很多图文页面,类似新闻详情页,都是一个H5网页,当我们点击网页中的图片,希望跳转到一个多图游览的页面,并且支持手势缩放和保存的一些功能。今天主要整理一下点击网页中图片,跳转到指定图片的查看页面即可,手势缩放可以使用photoview。
原理 效果
原理
首先点击h5页面,跳转本地页面,是js调用原生代码
Js通过WebView调用Android代码有三种方式
通过WebView的addJavascriptInterface()进行对象映射
通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息
通过addJavascriptInterface定义js接口的方式比较方便,所以本文采用的是这种方式,详细见下列代码
定义js接口
找到网页中img标签的代码块,设置点击
相关权限和混淆
代码 定义js接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ** * Created by fengan on 2016 /3 /8 . * email:fengan1102@gmail .com * 点击webview页面图片,跳转查看大图页面的js接口 * 检查混淆文件,确保未被混淆 */ public class JavaScriptInterface { private Activity mContext; private ArrayList<String> mImgList = new ArrayList<>(); public JavaScriptInterface (Activity context) { this .mContext = context; } @JavascriptInterface public void addImageUrl (String img) { mImgList.add(img); } @JavascriptInterface public void openImage (String img) { if (ClickUtils.noDoubleClick()) { int index = mImgList.indexOf(img); PhotoListAty.startAty(index == -1 ? 0 : index, mImgList, mContext); } } }
自定义WebClient 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 public class MyWebViewClient extends WebViewClient { @Override public void onPageFinished (WebView view, String url) { view.getSettings().setJavaScriptEnabled(true ); super .onPageFinished(view, url); addImageClickListener(view); } @Override public void onPageStarted (WebView view, String url, Bitmap favicon) { view.getSettings().setJavaScriptEnabled(true ); super .onPageStarted(view, url, favicon); } private void addImageClickListener (WebView webView) { webView.loadUrl("javascript:(function(){" + "var objs = document.getElementsByTagName(\"img\"); " + "for(var i=0;i<objs.length;i++) " + "{" + "window.imagelistener.addImageUrl(objs[i].src); " + " objs[i].onclick=function() " + " { " + " window.imagelistener.openImage(this.src); " + " } " + "}" + "})()" ); }
1 2 3 4 mWebview.getSettings().setJavaScriptEnabled(true ); mWebview.addJavascriptInterface(new JavaScriptInterface(this ), "imagelistener" ); mWebview.setWebViewClient(new MyWebViewClient());
注意事项 注意在混淆文件中添加
项目中暴露的js接口类:MJavascriptInterface不能混淆,其调用的方法的声明也不能混淆,所以还要添加如下混淆设置代码(代码因包名而变化)
1 2 3 4 5 6 -keepclassmembers class com.example.administrator.webviewpagescannerapp.other.MJavascriptInterface{ public *; } -keepattributes *Annotation* -keepattributes *JavascriptInterface*