Android 主动注入 JS 代码

662 阅读2分钟

1. WebView 基础接口

在 Android 中,主动注入 JavaScript 代码到 WebView 中可以通过 evaluateJavascriptloadUrl 方法来实现。具体的方式取决于你使用的 API 级别。

方式一:evaluateJavascript(API 19+)

从 Android 4.4 (API Level 19) 开始,你可以使用 evaluateJavascript 方法,它允许你直接向 WebView 注入 JavaScript 代码,并且可以获取执行结果。

webView.evaluateJavascript("javascript:yourFunctionName()", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String value) {
        // 处理 JavaScript 执行结果
    }
});

方式二: loadUrl

对于 API Level 18 及以下的设备,你可以使用 loadUrl 方法来注入 JavaScript 代码,但无法获取执行结果。

webView.loadUrl("javascript:yourFunctionName()");

注意事项

  1. 安全性: 确保注入的 JavaScript 代码是安全的,避免使用来自不可信来源的代码。

  2. WebView 设置: 确保在 WebView 设置中启用了 JavaScript 支持。

    webView.getSettings().setJavaScriptEnabled(true);
    
  3. WebView Client: 在某些情况下,你可能需要设置自定义的 WebViewClientWebChromeClient 来处理页面加载和 JS 脚本的执行。

通过这种方式,你可以主动注入和执行 JavaScript 代码,实现与 WebView 中的网页内容进行交互。

2. Android 注入 JS 代码

以监听 JavaScript 页面上点击为例, 要监听当前 JavaScript 页面上所有控件的点击事件,并将这些事件传递回 Android,可以按照以下步骤进行操作:

2.1 启用 JavaScript

确保 WebView 启用了 JavaScript 支持:

WebView webView = findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);

2.2 创建 JavaScript 接口

使用 addJavascriptInterface 将一个 Java 对象注入到 WebView 的 JavaScript 环境中。

public class WebAppInterface {
    Context mContext;

    WebAppInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void onElementClick(String elementId) {
        // 处理点击事件,例如显示 Toast 或执行其他操作
        Toast.makeText(mContext, "Clicked on: " + elementId, Toast.LENGTH_SHORT).show();
    }
}

将这个接口注入到 WebView 中:

webView.addJavascriptInterface(new WebAppInterface(this), "AndroidInterface");

2.3 注入 JavaScript 代码监听所有控件的点击事件

使用 evaluateJavascriptloadUrl 方法注入 JavaScript 代码来监听所有元素的点击事件。可以通过循环遍历页面上的所有元素,并为每个元素添加一个点击事件监听器。

java
复制代码
String jsCode = "document.querySelectorAll('*').forEach(function(element) {" +
                "    element.addEventListener('click', function() {" +
                "        var elementId = element.id || element.tagName;" +
                "        AndroidInterface.onElementClick(elementId);" +
                "    });" +
                "});";

webView.evaluateJavascript(jsCode, null);

或者使用 loadUrl 注入代码:

webView.loadUrl("javascript:(function() {" +
                "   document.querySelectorAll('*').forEach(function(element) {" +
                "       element.addEventListener('click', function() {" +
                "           var elementId = element.id || element.tagName;" +
                "           AndroidInterface.onElementClick(elementId);" +
                "       });" +
                "   });" +
                "})()");

2.4 处理点击事件

在 Java 接口的 onElementClick 方法中处理这些点击事件。你可以根据 elementId 来区分点击的是哪个元素。

注意事项

  • 性能: 如果页面上元素非常多,遍历所有元素并添加事件监听器可能会对性能产生一定影响。
  • 动态加载的内容: 如果页面内容是动态加载的,你可能需要在内容加载完毕后再注入这段 JavaScript 代码,或者在每次动态加载时重新注入。
  • 安全性: 处理好 JavaScript 和 Android 之间的通信,避免暴露敏感信息。

通过这种方式,你可以监听网页中的所有元素点击事件,并将信息传递回 Android 进行处理。