前言
在 android 开发中,javascript(js)调用原生 android 接口主要通过 webview 组件实现。以下是常见的 3 种核心方式及具体实现逻辑:
1. addjavascriptinterface 注入接口
原理:通过 webview 向 js 暴露一个 java 对象,js 可直接调用该对象中被 @javascriptinterface
注解标记的方法
步骤:
- 定义接口类:
public class webappinterface { context mcontext; webappinterface(context c) { mcontext = c; } @javascriptinterface public void showtoast(string msg) { toast.maketext(mcontext, msg, toast.length_short).show(); } }
- 注入接口到 webview:
webview.getsettings().setjavascriptenabled(true); webview.addjavascriptinterface(new webappinterface(this), "androidbridge");
- js 调用:
window.androidbridge.showtoast("hello from js!");
注意事项:
- 安全风险:若未使用
@javascriptinterface
注解,可能导致任意方法被调用(如系统敏感 api) - api 版本:需最低支持 api 17(android 4.2)
2. 拦截 webchromeclient 对话框
原理:通过重写 webchromeclient
的对话框回调方法(如 onjsprompt
),解析 js 发送的指令
步骤:
- 自定义 webchromeclient:
webview.setwebchromeclient(new webchromeclient() { @override public boolean onjsprompt(webview view, string url, string message, string defaultvalue, jspromptresult result) { if (message.startswith("native:")) { // 协议约定 handlenativecall(message); // 解析并执行原生逻辑 result.confirm("success"); // 返回结果给 js return true; } return super.onjsprompt(view, url, message, defaultvalue, result); } });
- js 调用:
prompt("native:showtoast", "{'msg':'hello'}"); // 通过 prompt 发送指令
适用场景:
- 需要双向通信(js 可获取原生返回值);
- 兼容低版本 android(无需依赖
@javascriptinterface
)
3. 拦截 url scheme
原理:js 触发特定格式的 url 请求(如 myapp://action?params
),android 通过 shouldoverrideurlloading
拦截并处理
步骤:
- 自定义 webviewclient:
webview.setwebviewclient(new webviewclient() { @override public boolean shouldoverrideurlloading(webview view, string url) { if (url.startswith("myapp://")) { // 协议约定 parseurl(url); // 解析 url 并执行对应逻辑 return true; // 阻止默认加载 } return super.shouldoverrideurlloading(view, url); } });
- js 调用:
window.location.href = "myapp://showtoast?msg=hello"; // 或通过 iframe 触发
优缺点:
- 优点:兼容性最好(支持所有 android 版本);
- 缺点:仅支持单向调用(js 无法直接获取原生返回值)
安全建议
- 输入校验:对 js 传递的参数进行严格校验,防止注入攻击
- 最小权限原则:仅暴露必要的接口方法,避免敏感操作(如文件读写)
- https 加密:加载远程页面时使用 https,避免中间人攻击
总结
到此这篇关于javascript调用android接口常见的3种方式的文章就介绍到这了,更多相关js调用android接口内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论