美文网首页
Android与Js交互

Android与Js交互

作者: 七岁的凯哥 | 来源:发表于2019-12-23 21:24 被阅读0次

    对于Android调用JS代码的方法有2种: 

    1. 通过WebView的loadUrl() 

    2. 通过WebView的evaluateJavascript()

    对于JS调用Android代码的方法有3种: 

    1. 通过WebView的addJavascriptInterface()进行对象映射 

    2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url 

    3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

    步骤如下:

    首先在activity获取到WebView可设置的对象 getSettings()方法,通过获取到的对象设置与JS交互的权限setJavaScriptEnabled(true)设置为true为可交互,默认为false,此外还可以设置是否允许JS进行弹窗口操作setJavaScriptCanOpenWindowsAutomatically(true)根据情况设置。

    加载js代码  : WebVIew.loadURL("file:///包名/类名.html"),其余都是死格式

    在mian包下面创建assets包,包里创建androidJs.html

    Carson_Ho functionclickprompt(){// 调用prompt()varresult=prompt("js://demo?arg1=111&arg2=222"); alert("demo "+ result);}

    Android与Js交互

    function androidJs(){document.getElementById("xx").innerHTML = "http://l23.l23l23.com/photoM/8546/01.jpg"}function androidJsTwo(x){document.getElementById("xx").innerHTML = xdocument.location = xreturn x;}function jsAndroid(){//prompt("Js调用了Android");document.location = "http://l23.l23l23.com/photoM/8546/01.jpg"JsCall.getMessage("http://l23.l23l23.com/photoM/8546/01.jpg");}<buuton onclick = “jsAndroid()” type = “button”>按钮</button><p id = “XX”>在这里修改</p>

    以上准备工作做完了。

    Android调用JS

    方法一:

    1.当我们点击某的按钮时出发交互。还是通过WebView控件调用loadURL("javascript:方法名()")(在html里我们定义的方法名,方法分有参无参。就想我们java的方法一样。。如果是有参String类型的  ' '    用俩个单引号代替双引号)

    Button的点击事件里,调用了Js有参方法

    方法二:

    通过WebView控件调用evaluateJavascript("javascript:方法名", 实现ValueCallback接口)。在我们实现接口的同时会重写onReceiveValue方法,方法里有一个String value,value使我们的WebView的返回的结果。

    通过loadUrl方法交互时,会使页面刷新。方便简洁,效率低。

    通过evaluateJavascript交互时不会,效率高,Android4.4以上可以用

    以上我们的Android与JS交互就此结束。

    JS调用Android代码 三个方法:

    方法一:

    采用内部类的方法。通过 WebView的addJavascriptInterface()进行对象映射

    内部类继承Object ,创建方法,此方法是我们需要在JS里面进行调用的。

    然后调用addJavascriptInterface()方法,方法里需要俩个参数.

    参数一:内部了对象;参数二:String类型的值,就相当于我们给内部类起个变量名,然后在JS里通过这个值在JS里调用到方法。。。(即  值.内部类的方法())

    class JsAndAndroidextends Object {private Contextcontext;public JsAndAndroid(Context context) {this.context = context;}@JavascriptInterface//        次注解避免了漏洞攻击        public void getMessage(final String msg) {Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();//            在这里更新UI的需要进行在主线程            runOnUiThread(new Runnable() {@Override                public void run() {webView_Tv.setText(msg);Glide.with(MainActivity.this).load(msg).into(mImg);}});}}作者:Harrison_CSL链接:https://www.jianshu.com/p/2917babeada1来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    大概就是这样。

    这里给大家说一下addJavaSCriptInterface()方法4.2之前和4.2之后(4.2之前有漏洞)。

    当JS拿到Android这个对象后,就可以调用这个Android对象中所有的方法,包括系统类(java.lang.Runtime 类),从而进行任意代码执行。就比如我们通过一个App扫描二维码打开一个WebView时候,我们的信息就可能会造成泄漏

    在Android4.2版本后出来了@JavascriptInterface

    您大可以放心因为我们采用了@JavascriptInterface这个注解对避免了漏洞的攻击

    在Android4.2之前:采用拦截prompt()进行漏洞修复。

    方法二:

    实现WebChromeClient接口,重写onJsAlert。这个方法主要是拦截弹框的方法 。实现接口重写方法 onJsPrompt、onJsAlert、onJsConfirm。方法。才用这个方

    法就我们需要在HTML里进行弹窗的操作

    原理:Android通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调分别拦截JS不同的对话框 ,得到他们的消息内容,然后解析即可。

    方法三:

    实现WebViewClient接口,重写shouldOverrideUrlLoading()回调拦截Url

    具体原理: 

    Android通过 WebViewClient 的回调方法shouldOverrideUrlLoading ()拦截 url

    解析该 url 的协议

    如果检测到是预先约定好的协议,就调用相应方法

    Js调Android代码总结:

    简单来说:

    Android调用JS:就是Android想要执行的代码交给JS去执行。

    JS调用Android:就是JS数据交给Android去执行。

    相关文章

      网友评论

          本文标题:Android与Js交互

          本文链接:https://www.haomeiwen.com/subject/ddptoctx.html