1. 主页 > 大智慧

WebView中JS调用Java方法的完整教程

你是不是正在开发一个安卓App,里面嵌入了H5页面,然后发现??H5里的JS代码需要调用安卓原生的功能???比如调个相机、弹个Toast,或者读取本地文件?别急,今天咱们就彻底搞懂??WebView里JS怎么调Java方法??,保证让你看完就能上手!


一、为什么要在WebView里让JS调Java?

先搞清楚需求!??WebView??就是个“浏览器控件”,可以加载网页。但有时候,H5页面需要:
? ??调用手机硬件??(比如相机、GPS)
? ??使用原生功能??(比如安卓的Toast提示)
? ??读取本地数据??(比如SharedPreferences)

??问题来了??:JS在浏览器环境里跑,Java在安卓原生环境跑,??它俩咋通信???

答案就是——??JSBridge??!


二、最基础的JS调Java方法(@JavascriptInterface)

1. Java端:暴露方法给JS

首先,你得在安卓端写个类,把方法暴露给JS:

java复制
// 这个类专门用来和JS通信
public class JSBridge {
    private Context context;

    public JSBridge(Context context) {
        this.context = context;
    }

    // 关键注解!没这个JS调不了
    @JavascriptInterface  
    public void showToast(String message) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }

    // 再写个复杂点的,带返回值
    @JavascriptInterface
    public String getDeviceInfo() {
        return "手机型号:" + Build.MODEL;
    }
}

2. WebView设置:绑定JSBridge

然后,在WebView里把这个类绑定到JS环境:

java复制
WebView webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true); // 必须开JS支持!

// 把JSBridge对象绑定到window.androidBridge
webView.addJavascriptInterface(new JSBridge(this), "androidBridge");

// 加载你的H5页面
webView.loadUrl("file:///android_asset/index.html");

3. JS端:直接调用Java方法

最后,在H5的JS代码里就能这么调:

javascript复制
// 调用showToast方法
window.androidBridge.showToast("我是JS,我在调安卓原生方法!");

// 调用getDeviceInfo,还能拿到返回值
const deviceInfo = window.androidBridge.getDeviceInfo();
console.log(deviceInfo);

??搞定!?? 就这么简单~


三、进阶技巧:参数传递和回调处理

1. 传复杂参数(JSON)

Java方法支持接收String,那如果JS想传个对象怎么办???转JSON字符串呗!??

javascript复制
// JS端:传对象
const user = { name: "张三", age: 18 };
window.androidBridge.handleUserData(JSON.stringify(user));
java复制
// Java端:解析JSON
@JavascriptInterface
public void handleUserData(String userJson) {
    JSONObject json = new JSONObject(userJson);
    String name = json.getString("name");
    int age = json.getInt("age");
    // 处理逻辑...
}

2. Java回调JS(evaluateJavascript)

有时候Java处理完还得通知JS,咋办?用webView.evaluateJavascript

java复制
// Java端:执行JS代码
webView.evaluateJavascript("javascript:jsCallback('处理完成')", null);
javascript复制
// JS端:提前定义好回调函数
function jsCallback(result) {
    alert("Java说:" + result);
}

四、安全性问题(必看!)

??? 警告??:随便让JS调Java方法可能会被黑客利用!比如:

? 错误示范:暴露删除文件的方法

java复制
@JavascriptInterface
public void deleteFile(String path) {
    new File(path).delete(); // 危险!JS可以任意删文件
}

??? 正确做法??:

  1. ??限制方法权限??(比如只读操作)
  2. ??校验参数??(防止恶意路径)
  3. ??不要暴露敏感操作??(比如支付、删库)

五、实际案例:JS调安卓相机

假设H5页面有个按钮,点击后调用安卓相机拍照:

1. Java端代码

java复制
@JavascriptInterface
public void openCamera() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    ((Activity)context).startActivityForResult(intent, 100);
}

2. JS端代码

javascript复制
document.getElementById("cameraBtn").onclick = function() {
    window.androidBridge.openCamera();
};

??效果??:点击H5按钮 → 直接打开安卓相机!


六、常见坑点排查

问题现象可能原因解决方案
??JS调用没反应??没加@JavascriptInterface注解检查Java方法是否有注解
??报错:undefined??WebView未绑定JSBridge对象检查addJavascriptInterface
??安卓4.2以下崩溃??漏洞防护机制触发方法名不要带"alert"等关键词
??参数传递失败??没转JSON或格式错误JS用JSON.stringify处理

个人观点

其实WebView的JSBridge就像??两个语言之间的翻译官??:

  • ??JS说??:“帮我弹个Toast!”
  • ??Java听懂了??:“好嘞,马上办!”

刚开始可能觉得配置麻烦,但用顺手后你会发现——??混合开发真香!?? 既能用H5快速迭代,又能享受原生功能,妥妥的“双赢”~

最后记住:??安全第一!?? 别让JS随便调敏感方法,不然你的App可能分分钟变“肉鸡”。好了,快去试试吧!

本文由嘻道妙招独家原创,未经允许,严禁转载