Android和js交互

1.MainActivity类

public class MainActivity extends AppCompatActivity {

    private WebView wv_url;

    @SuppressLint("JavascriptInterface")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setTitle("android调用js");


        wv_url = (WebView) findViewById(R.id.wv_url);

        wv_url.getSettings().setJavaScriptEnabled(true);
       wv_url.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

       wv_url.setWebChromeClient(new WebChromeClient(){

       });

        wv_url.loadUrl("file:///android_asset/js.html");



    }

    public void Java_js(View v){
        wv_url.loadUrl("javascript:getImg()");
    }
}
2.JsAndroid 类


public class JsAndroid {
    private WebView mWebView;

    public JsAndroid(WebView mWebView) {
        this.mWebView = mWebView;
    }

    @JavascriptInterface
    public void setImg(){
        mWebView.post(new Runnable() {
            @Override
            public void run() {

                mWebView.loadUrl("javascript:getImg('https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2478328247,1838208372&fm=117&gp=0.jpg')");
            }
        });

    }




}

3.html写法

<html>
<meta charset="UTF-8">
<head>


    <script>
        function getImg(){

        alert("java调用了js");

        }

    </script>


</head>


<body>


</body>

</html>

Android 应用中,如果需要与 WebView 中加载的网页进行交互,尤其是与 JavaScript 进行双向通信,可以使用 Android 提供的 `WebView` `addJavascriptInterface` 方法实现 Java 与 JavaScript 的交互。 --- ### 示例:Android 与 JavaScript 交互传值 #### 1. 布局文件 `activity_main.xml` ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> ``` #### 2. Java 代码 `MainActivity.java` ```java package com.example.androidjs; import android.os.Bundle; import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webview); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // 启用 JavaScript // 添加 JavaScript 接口 webView.addJavascriptInterface(new WebAppInterface(), "Android"); // 加载本地 HTML 文件(放在 assets 目录下) webView.loadUrl("file:///android_asset/index.html"); } // 定义一个类,用于暴露给 JS 调用 public class WebAppInterface { @JavascriptInterface public void showToast(String message) { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); } @JavascriptInterface public String getMessageFromAndroid() { return "Hello from Android!"; } } } ``` #### 3. HTML 文件 `index.html`(放在 `assets` 目录下) ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Android JS Interaction</title> <script type="text/javascript"> function callAndroidToast() { Android.showToast("Hello from JavaScript!"); } function getAndroidMessage() { var message = Android.getMessageFromAndroid(); document.getElementById("output").innerText = message; } </script> </head> <body> <h1>Android - JavaScript 交互示例</h1> <button onclick="callAndroidToast()">点击调用 Android 的 Toast</button> <br><br> <button onclick="getAndroidMessage()">获取 Android 的消息</button> <p id="output"></p> </body> </html> ``` --- ### 代码解释 1. **启用 JavaScript**: - 在 `WebView` 中启用 JavaScript 是交互的前提。 - 使用 `webSettings.setJavaScriptEnabled(true);` 2. **添加 JavaScript 接口**: - 使用 `addJavascriptInterface()` 方法将 Java 对象暴露给 JavaScript。 - 本例中将 `WebAppInterface` 类暴露为 `Android` 对象,JavaScript 可以通过 `Android.showToast()` `Android.getMessageFromAndroid()` 调用。 3. **JavaScript 调用 Java 方法**: - 在 HTML 文件中,JavaScript 可以直接调用 `Android.showToast("message")` 来触发 Android 的 `Toast`。 4. **Java 调用 JavaScript 方法**: - 如果你需要从 Android 主动调用 JavaScript 方法,可以使用 `webView.evaluateJavascript()` 方法: ```java webView.evaluateJavascript("javascript:document.getElementById('output').innerText = 'Updated from Android'", null); ``` --- ### 注意事项 - **安全问题**:从 Android 4.2(API 17)开始,`@JavascriptInterface` 注解是必须的,否则 JS 无法访问 Java 方法。 - **线程问题**:JS 调用 Java 方法是在主线程中执行的,不能执行耗时操作。 - **权限问题**:如果加载的是网络资源,确保在 `AndroidManifest.xml` 中添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值