开发时遇到了这样的需求:
1.网页自动设置中的标题名,
中有定位功能,得到定位结果后要回传给网页。
其实就是js代码和java代码的相互调用,
下面我们就来实现这样的需求。
设置,给添加js接口
=()();mWebView.getSettings().setJavaScriptEnabled(true);mWebView.getSettings().setSupportZoom(true);WebSettingswebSetting=mWebView.getSettings();webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);//JSInte类中的方法会被js代码调用。调用方式为,js.fun();这里的“js”就是第二个参数。mWebView.addJavascriptInterface(newJSInte(this),"js");
下面是JSInte类,该类中被js调用的方法必须添加@JavascriptInterface注解。而且必须用public修饰。
publicclassJSInte{privateActivityactivity;publicJSInte(Activityactivity){this.activity=activity;}//js调用java:js.goBack();@JavascriptInterfacepublicvoidgoBack(){activity.onBackPressed();}@JavascriptInterfacepublicvoidsetTitle(Stringtitle){//给Activity设置Title((BaseTitleActivity)activity).getTitleBar().setTitleText(title);}//获取经纬度@JavascriptInterfacepublicStringgetLocation(){if(activityinstanceofLocationAble){return((LocationAble)activity).getLocation();}else{returnnull;}}}
setTitle()方法中,将activity强转为父类,获取titleBar,设置title。
goBack()方法则和getLocation()方法在Activity中为:
注意:让activity实现LocationAble接口,判断activityinstanceofLocationAble,是因为如果有Activity1和Activity2都需要被网页调用getLocation方法,则无法判断应将该activity强转为哪个。使用LocationAble接口就可以直接调用接口中的方法即可。
//这个接口很简单只有一个getLocation()方法publicinterfaceLocationAble{StringgetLocation();}//当webView中的网页可以返回时调用网页的返回。否则,结束activity。@OverridepublicvoidonBackPressed(){if(mWebView.canGoBack()){mWebView.goBack();}else{finish();}}//这个需要用到定位当有定位结果时,返回定位结果中的经纬度,没有则返回null。@OverridepublicStringgetLocation(){if(mLocation!=null){doublelatitude=mLocation.getLatitude();doublelongitude=mLocation.getLongitude();returnlongitude+"_"+latitude;}else{returnnull;}}
如果网页调用Java的getLocation方法时,如果这时没有定位成功,网页就获取不到经纬度。有两个方法解决这个问题:1.网页开循环,每隔一段时间就调用一下getLocation(),有返回结果后停止循环。(显然这种方法很不好)2.本地定位成功后,主动调用网页的方法,将经纬度传递过去。
BDAbstractLocationListenerlistener=newBDAbstractLocationListener(){@OverridepublicvoidonReceiveLocation(BDLocationbdLocation){mLocation=bdLocation;doublelatitude=mLocation.getLatitude();doublelongitude=mLocation.getLongitude();Stringresult=longitude+"_"+latitude;//这里的acceptLocation方法就是网页上的js方法,接收一个参数mWebView.loadUrl("javascript:acceptLocation('"+result+"')");//如果是两个参数写法是这样,之前由于中间逗号两边没加单引号','导致调用不成功mWebView.loadUrl("javascript:acceptLocation('"+longitude+"','"+latitude+"')");}};
最后,JsInte类需要在混淆文件中配置,否则打包后js无法调用Java方法
-keeppublicclasscom.app.application.ui.js.JSInte{publicmethods}