js跟java代码交付,java代码和js代码相互调用

742a0954a6e6ebf0c08cb9c497e8f870.jpg

开发时遇到了这样的需求:

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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值