`
java_cofi
  • 浏览: 48784 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android 与 javascript 通讯分析

阅读更多

1.  AndroidManifest.xml中必须使用许可 "android.permission.INTERNET", 否则会出Web page not available错误。

    <uses-permission android:name="android.permission.INTERNET"/>

2.  如果访问的页面中有Javascript,则webview必须设置支持Javascript。

1   WebSettings webSetting = webview.getSettings();
2   webSetting.setJavaScriptEnabled(true);

3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象或者覆盖webview的 setWebChromeClient

1 mWebView.setWebViewClient(new WebViewClient(){
2 public boolean shouldOverrideUrlLoading(WebView view, String url) { 
3     view.loadUrl(url); 
4     return true; 
5    }
6  });

 

复制代码
 1   mWebView.setWebChromeClient(new MyWebChromeClient()
 2             @Override
 3             public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
 4                 Log.d(LOG_TAG, message);
 5                 result.confirm();
 6                 return true;
7             });
复制代码

 

4.  如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。

复制代码
1 public boolean onKeyDown(int keyCode, KeyEvent event) { 
2   if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { 
3     mWebView.goBack(); 
4     return true; 
5   } 
6   return super.onKeyDown(keyCode, event); 
7 } 
复制代码

 

 5.  javascript对象 与 android 对象绑定

WebView注入Java对象

  对象注入即通过webview 建立 javascript对象 与 android 原生对象的绑定关系,下面代码中,obj1对象在android程序中可以操作,obj2在js程序中可以操作,两者操作的均为同一个内存对象,即可以理解为,两个绑定的对象是同一个对象在不同运行环境下的一个别名(仅个人理解,有误请大牛指正)

1 webview.getSetting().setJavaScriptEnable(true);  
2 class JsObject {  
3     @JavascriptInterface  
4     public String toString() { return "injectedObject"; }  
5  }  
6  webView.addJavascriptInterface(new JsObject()obj1, "injectedObject"obj2);  

  上面的程序建立 javascript 与android 程序的绑定关系,android 4.2 之后版本提供给js调用的函数必须带有注释语句@JavascriptInterface ,4.2版本之前向webview注入的对象所暴露的接口不是必须带有@JavascriptInterface注释语句(需要注意,android adt,eclipse生成的工程,低版本中会自动带有 anotations.jar,支持@JavascriptInterface, 而高版本中工程中,不会自动带有anotations.jar包,所以要加入注释语句@JavascriptInterface,首先要自己手动加入anotations.jar包,不要忘记import 哦!本人就犯过这么低级的错误哦)

   官方文档解释是因为这个接口允许JavaScript 控制宿主应用程序,这是个很强大的特性,但同时,在4.2的版本前存在重大安全隐患,因为JavaScript 可以使用反射访问注入webview的java对象的public fields,在一个包含不信任内容的WebView中使用这个方法,会允许攻击者去篡改宿主应用程序,使用宿主应用程序的权限执行java代码。因此4.2以后,任何为JS暴露的接口,都需要加 @JavascriptInterface 注释,这样,这个Java对象的fields 将不允许被JS访问。[2] 

   注:如果将targetSdkVersion 设置为17或者更高,但却没有给暴露的js接口加@JavascriptInterface注释,则logcat会报如下输出:

   Console: Uncaught TypeError: Object [object Object] has no method 'toString'

  (需要特注意的一点,这里的限制是通过 targetSdkVersion 为标准,即如果工程采用了android sdk的版本是4.2以上,但是 targetSdkVersion 的版本在17之下,那么该状态下生成的应用,不过报错,如果targetSdkVersion 设置为>=17 就需要特别主意,要加上 @JavascriptInterface注释语句了, 所有建议在各种版本下都采用@JavascriptInterface注释,就万无一失了)

 

6.  在做webview开发是经常会加载本机的html文件如下:

 file:///android_asset/teste.html   加载项目assets下的文件teste.html

 file:///sdcard/index.html       加载sdcard下的index.html文件

 

源代码:

android

复制代码
 1      private WebView mWebView;
 2       private Handler mHandler = new Handler();
 3       
 4       @Override
 5       protected void onCreate(Bundle savedInstanceState) {
 6           super.onCreate(savedInstanceState);
 7          setContentView(R.layout.main);
 8          mWebView = (WebView) findViewById(R.id.webview);
 9 
10          WebSettings webSettings = mWebView.getSettings();
11          webSettings.setJavaScriptEnabled(true);
12          webSettings.setSavePassword(false);
13          webSettings.setSaveFormData(false);
14          webSettings.setSupportZoom(false);
15  
16          mWebView.setWebChromeClient(new MyWebChromeClient());
17          mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
18  //      mWebView.loadUrl("http://www.baidu.com/");
19          mWebView.loadUrl("file:///android_asset/demo.html");
20      }
21      
22       final class DemoJavaScriptInterface {
23              DemoJavaScriptInterface() {
24                  Log.i("aaaa", "create DemoJavaScriptInterface");
25              }
26              /**
27               * This is not called on the UI thread. Post a runnable to invoke
28               * loadUrl on the UI thread.
29               */
30         @JavascriptInterface
31              public void clickOnAndroid() {
32                 mHandler.post(new Runnable() {
33                     public void run() {
34                          mWebView.loadUrl("javascript:wave()");
35                      }
36                  });
37              }
38          }
39          /**
40          * Provides a hook for calling "alert" from javascript. Useful for
41           * debugging your javascript.
42           */
43         final class MyWebChromeClient extends WebChromeClient {
44             @Override
45              public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
46                 result.confirm();
47                 return true;
48             }
49         }
复制代码

 

html源文件

复制代码
 1 <!DOCTYPE html>
 2 <html>
 3     <script language="javascript">
 4         /* This function is invoked by the activity */
 5         function wave() {
 6             alert("1");
 7             document.getElementById("droid").src="android_waving.png";
 8             alert("2");
 9         }
10     </script>
11     <body>
12         <!-- Calls into the javascript interface for the activity -->
13         <a onClick="window.demo.clickOnAndroid()">
14         <div style="width:80px;
15             margin:0px auto;
16             padding:10px;
17             text-align:center;
18             border:2px solid #202020;" >
19                 <img id="droid" src="android_normal.png"/><br>
20                 Click me!
21         </div></a>
22     </body>
23 </html>

本文转自http://www.cnblogs.com/yaozhongxiao/p/3408948.html
分享到:
评论

相关推荐

    android嵌套HTML的程序,相互间传值

    总结,Android与H5的交互是移动开发中的常见需求,通过合理的数据传递机制,我们可以实现两者之间的深度融合,为用户提供更丰富的功能和体验。在实践过程中,注意安全性和性能优化,确保应用的稳定性和用户数据的...

    weex android Demo

    4. **事件交互**:Weex 提供了 JavaScript 和 Android 之间的通讯机制。在 JavaScript 代码中,你可以通过 `WXSDKInstance` 的 `fireEvent` 方法发送事件到 Android 端;在 Android 端,你可以通过 `WXSDKInstance` ...

    Android聊天客户端与服务器代码

    通过分析这些代码,我们可以学习如何在Android平台上实现一个完整的聊天应用。 总结来说,这个项目涵盖了Android应用开发、网络通信、数据交换格式、服务器端编程、数据存储以及安全性等多个重要知识点,对于想要...

    android手机安全卫士

    1.整体项目采用MVC框架,是对android知识点的综合应用,用到的技术有 (activity,service,broadcast,content provider,Notification , 数据库,自定义title,自定义控件,自定义toast,widget,aidl进程间通讯, javascript和...

    完整优化版H5即时通讯客服IM聊天系统(微信+安卓+苹果端APP源码

    《构建与优化H5即时通讯客服IM聊天系统:微信、安卓与苹果端的全面解析》 在当前数字化时代,即时通讯技术已经成为了企业与客户沟通的重要桥梁,尤其是在移动设备上,微信、安卓和苹果端的IM(Instant Messaging)...

    Android连接服务器端

    本文基于《Android手机访问服务器的一种数据交互方法》这一研究,深入探讨了Android终端与Web服务器之间数据交互的有效策略和技术实现细节。 #### 核心知识点解析 ##### 1. Android API分析 - **API简介**:...

    cordova集成RS232串口通讯

    总的来说,"cordova集成RS232串口通讯"是一个将Web技术与硬件设备深度结合的实践,它需要开发者对Cordova框架、JavaScript编程、串口通讯原理以及移动平台的硬件接口有深入的理解。通过这样的集成,我们可以构建出...

    Android开发艺术探索

    根据提供的文件信息,“Android开发艺术探索”是一本关于Android开发的专业书籍,虽然描述部分较为简略,但从标题可以看出本书旨在深入探讨Android开发的艺术和技术精髓。接下来,我们将基于这些信息来生成相关的...

    Android 即时聊天

    首先,即时通讯的核心是客户端与服务器之间的数据传输。在Android应用中,通常使用HTTP或HTTPS进行基础的数据交换,但为了实现实时通信,需要更高效的技术,如Socket编程。Socket允许创建双向通信通道,使客户端和...

    Android移动开发一本就够

    《Android移动开发一本就够》是一本全面覆盖Android开发领域的专业书籍,旨在为读者提供从理论基础到实践操作的全方位指导。本书不仅适用于Android应用程序开发者,同时也对QA测试人员、项目经理及市场推广人员提供...

    cloudtalk即时通讯系统 v4.0.1.zip

    "cloudtalk即时通讯系统 v4.0.1.zip" 是一个包含了源代码和相关文档的压缩包,主要用于理解和学习即时通讯系统的开发与实现。这个版本是4.0.1,通常意味着它经过了多次迭代和优化,具备了一定的稳定性和功能完善性。...

    webView_studio

    2. **JavaScript Interface**:为了实现JS与Native的通信,Android提供了`addJavascriptInterface()`方法。通过此方法,我们可以创建一个Java对象,并暴露一些方法给JavaScript调用。这样,JavaScript可以通过特定的...

    企业内部通讯系统(源码)

    7. **移动适配**:考虑到移动办公的需求,系统通常会有对应的iOS和Android应用,利用React Native或Flutter等跨平台框架进行开发,提供与Web端类似的用户体验。 8. **性能优化**:为了处理大量并发用户,可能需要...

    Android_近百个项目的源代码

    标题与描述概述的知识点:Android源代码集合 在IT领域,尤其是移动开发行业,掌握和研究源代码是提升技能、理解和应用技术的关键途径之一。标题“Android_近百个项目的源代码”以及描述“Android_近百个项目的源...

    [聊天留言]即时通讯WEB程序 BICQ 2.0.0_bicq2.zip

    在分析BICQ 2.0.0之前,我们先了解一下即时通讯(Instant Messaging, IM)的基本概念。 即时通讯是一种在线通信方式,让用户能够即时发送和接收消息,通常支持一对一或群组聊天。在WEB端实现即时通讯,开发者通常会...

    环信及时通讯,前后端代码

    1. **环信API与SDK**:环信提供了全面的API接口和不同平台的SDK,包括Android、iOS、Web以及后端服务器。这些工具允许开发者轻松地在自己的应用程序中集成消息发送、接收、群组管理、在线状态查询等核心功能。 2. *...

    原生仿微信社交社区即时通讯聊天双端APP源码开源带PC客户端.txt

    该APP支持双端(Android与iOS)以及PC客户端,这涉及到跨平台开发技术的应用。 1. **React Native**:一种基于JavaScript的框架,允许开发者使用React构建原生移动应用。 2. **Flutter**:由Google开发的UI工具包,...

Global site tag (gtag.js) - Google Analytics