Android中WebView与JS的交互

1、首先了解一下webview。

webview介绍的原文如下:A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.

从上面你应该了解到了基本功能,也就是显示网页。之所以我说webview功能强大是因为它和js的交互非常方便,很简单就可以实现。

 

2、webview能做什么?

①webView可以利用html做界面布局,虽然目前还比较少人这么使用,不过我相信当一些客户端需要复杂的图文(图文都是动态生成)混排的时候它肯定是个不错的选择。

②直接显示网页,这功能当然也是它最基本的功能。

③和js交互。(如果你的js基础比java基础好的话那么采用这种方式做一些复杂的处理是个不错的选择)。

 

3、如何使用webview?

这里直接用一个svn上取下的demo,先上demo后讲解。demo的结构图如下:


WebViewDemo.java

package com.google.android.webviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;

/**
 * Demonstrates how to embed a WebView in your activity. Also demonstrates how
 * to have javascript in the WebView call into the activity, and how the activity 
 * can invoke javascript.
 * <p>
 * In this example, clicking on the android in the WebView will result in a call into
 * the activities code in {@link DemoJavaScriptInterface#clickOnAndroid()}. This code
 * will turn around and invoke javascript using the {@link WebView#loadUrl(String)}
 * method.
 * <p>
 * Obviously all of this could have been accomplished without calling into the activity
 * and then back into javascript, but this code is intended to show how to set up the 
 * code paths for this sort of communication.
 *
 */
@SuppressLint("JavascriptInterface")
public class WebViewDemo extends Activity {

    private static final String LOG_TAG = "WebViewDemo";

    private WebView mWebView;

    private Handler mHandler = new Handler();

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        mWebView = (WebView) findViewById(R.id.webview);

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setSavePassword(false);
        webSettings.setSaveFormData(false);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(false);

        mWebView.setWebChromeClient(new MyWebChromeClient());

        mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");

        mWebView.loadUrl("file:///android_asset/demo.html");
    }

    final class DemoJavaScriptInterface {

        DemoJavaScriptInterface() {
        }

        /**
         * This is not called on the UI thread. Post a runnable to invoke
         * loadUrl on the UI thread.
         */
        @JavascriptInterface     
        public void clickOnAndroid() {
            mHandler.post(new Runnable() {
                public void run() {
                    mWebView.loadUrl("javascript:wave()");
                }
            });

        }
    }

    /**
     * Provides a hook for calling "alert" from javascript. Useful for
     * debugging your javascript.
     */
    final class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Log.d(LOG_TAG, message);
            result.confirm();
            return true;
        }
    }
}

demo.html

<html>
    <script language="javascript">
        /* This function is invoked by the activity */
        function wave() {
            alert("1");
            document.getElementById("droid").src="android_waving.png";
            alert("2");
        }
    </script>
    <body>
        <!-- Calls into the javascript interface for the activity -->
        <a onClick="window.demo.clickOnAndroid()"><div style="width:80px;
            margin:0px auto;
            padding:10px;
            text-align:center;
            border:2px solid #202020;" >
                <img id="droid" src="android_normal.png"/><br>
                Click me!
        </div></a>
    </body>
</html>

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/intro"
        android:padding="4dip"
        android:textSize="16sp"
        />
    
    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent" 
        android:layout_height="0dip"
        android:layout_weight="1"
        />
        
</LinearLayout>

4、如何交互?

①android如何调用js。

调用 形式:

mWebView.loadUrl("javascript:wave()");

其中wave()是js中的一个方法,当然你可以把这个方法改成其他的方法,也就是android调用其他的方法。

②js如何调用android。

调用形式:

<a onClick="window.demo.clickOnAndroid()">

代码中的“demo”是在android中指定的调用名称,即

 mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");

代码中的clickOnAndroid()是“demo”对应的对象:new DemoJavaScriptInterface() 中的一个方法。

③双向交互。

当然是把前面的两种方式组合一下就可以了。

 

5、讲解demo。

现在你一定了解了android和js的交互了。是时候分析一些demo了,根据上面讲的你也应该比较清楚了。具体交互流程如下:

①点击图片,则在js端直接调用android上的方法clickOnAndroid();

②clickOnAndroid()方法(利用线程)调用js的方法。

③被②调用的js直接控制html。


6.@JavascriptInterface

在android4.2以前,注入步骤如下:

webview.getSetting().setJavaScriptEnable(true);
class JsObject {
    public String toString() { return "injectedObject"; }
 }
 webView.addJavascriptInterface(new JsObject(), "injectedObject");

Android4.2及以后,注入步骤如下:

webview.getSetting().setJavaScriptEnable(true);
class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
 }
 webView.addJavascriptInterface(new JsObject(), "injectedObject");

4.2之前向webview注入的对象所暴露的接口toString没有注释语句@JavascriptInterface,而4.2及以后的则多了注释语句@JavascriptInterface

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

@JavascriptInterface
注释,这样,这个Java对象的fields 将不允许被JS访问。


官方文档说明:


From the Android 4.2 documentation:

Caution: If you've set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.

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

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




转载自:http://www.cnblogs.com/vanezkw/archive/2012/07/02/2572799.html

http://blog.youkuaiyun.com/zgjxwl/article/details/9627685













<think>好的,用户想了解创芯科技CAN分析仪使用方法。我需要根据提供的引用资料来整理回答。首先,用户提到的引用[1][4]提到了官网下载驱动CANTest软件安装,还有Python二次开发的步骤。引用[2][3]强调了了解CAN通讯基础项目应用。应该分步骤讲解,从硬件准备、驱动安装、软件使用到二次开发。要注意使用正确的格式,比如行内数学公式用$符号,但这里可能用不上。还要生成相关问题,可能涉及驱动安装问题、CANTest功能、Python开发要点应用场景。需要确保回答结构清晰,步骤详细,引用标识正确添加。检查是否有遗漏的步骤,比如硬件连接或常见问题。最后确认是否符合用户需求,可能需要补充一些注意事项,比如系统兼容性或驱动安装顺序。</think>### 创芯科技CAN分析仪使用教程 #### 一、硬件准备与驱动安装 1. **硬件连接** 将创芯科技CAN分析仪(如CANalyst-II)通过USB接口连接到电脑,并确保开发板与CAN分析仪通过CAN总线正确连接(需匹配波特率)[^3]。 2. **驱动安装** - 访问创芯科技官网下载驱动及资料包,选择对应型号(如CANalyst-II)的驱动[^1]。 - 解压安装包,运行驱动程序(如`CH368Driver.exe`),按提示完成安装[^4]。 - 安装完成后,在设备管理器中确认是否识别到设备(显示为`USB-CAN Interface`或类似名称)。 --- #### 二、CANTest软件使用 1. **安装与配置** - 下载并安装`CANTest`测试软件(包含在资料包中)。 - 打开软件,选择设备类型为`USBCAN-2A/2B`,设置通道参数(如波特率、滤波模式等)[^3]。 2. **基础通信测试** - 点击“启动设备”按钮,开启CAN通道。 - 在“发送区”输入CAN帧数据(ID、数据域等),点击“发送”测试通信是否正常。 - 接收区显示从CAN总线读取的数据,验证双向通信功能[^2]。 --- #### 三、Python二次开发(以CANalyst-II为例) 1. **依赖库安装** - 根据设备提供的DLL文件(如`ControlCAN.dll`),使用`ctypes`库进行调用。 ```python from ctypes import * can_dll = windll.LoadLibrary("ControlCAN.dll") ``` 2. **初始化设备** ```python # 打开设备 ret = can_dll.VCI_OpenDevice(device_type, device_index, reserved) # 初始化CAN通道参数(波特率、工作模式等) config = VCI_INIT_CONFIG() can_dll.VCI_InitCAN(device_type, device_index, can_channel, byref(config)) ``` 3. **数据收发示例** ```python # 发送数据 send_frame = VCI_CAN_OBJ(ID=0x123, Data=[0x01, 0x02]) can_dll.VCI_Transmit(device_type, device_index, can_channel, byref(send_frame), 1) # 接收数据 recv_frames = (VCI_CAN_OBJ * 1000)() ret = can_dll.VCI_Receive(device_type, device_index, can_channel, byref(recv_frames), 1000, 100) ``` --- #### 四、注意事项 1. 确保开发板与分析仪的**波特率一致**,否则无法通信。 2. 若驱动安装失败,尝试以管理员权限运行安装程序或禁用驱动程序强制签名。 3. 调试时建议先通过`CANTest`验证硬件连接,再进行二次开发。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值