Android WebView搭载ASP.NET应用时条码扫描数据回传后端问题咨询
实现逻辑说明
你当前的核心问题是异步扫描得到的条码值需要桥接回WebView的JS上下文,再传递给ASP.NET后端,按以下步骤实现即可:
1. 前置配置确认
确保WebView已开启JS交互权限,且你定义的AndroidWebInterface已正确挂载:
// WebView配置必填项 webView.settings.javaScriptEnabled = true webView.addJavascriptInterface(AndroidWebInterface(), "AndroidWebInterface")
2. Web端新增接收扫描结果的JS函数
因为启动扫描是异步操作,无法通过getIcc()同步返回值,需要在你的ASP.NET Web应用的JS代码中新增全局回调函数,拿到结果后直接请求后端接口即可:
// JS侧全局函数,用于接收Android返回的条码值 function onBarcodeScanned(iccCode) { // 此处按你现有ASP.NET后端的接口规则发送请求即可,示例用fetch fetch('/api/your-aspnet-endpoint', { method: 'POST', headers: { 'Content-Type': 'application/json', // 携带你的Web应用原有鉴权凭证,避免权限校验失败 }, body: JSON.stringify({ icc: iccCode }) }) .then(res => res.json()) .then(data => { // 处理ASP.NET后端返回的响应逻辑 }) }
3. Android端拿到扫描结果后触发JS回调
修改你registerForActivityResult的回调逻辑,拿到条码值后调用WebView执行上述JS函数即可:
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val icc = result.data?.getStringExtra("icc") ?: return@registerForActivityResult // 转义条码中的特殊字符,避免JS执行报错 val escapedIcc = icc.replace("'", "\\'") // 主线程调用WebView执行JS回调 webView.evaluateJavascript("javascript:onBarcodeScanned('$escapedIcc')", null) // 兼容Android 4.4以下版本用下面的方法,无特殊需求可忽略 // webView.loadUrl("javascript:onBarcodeScanned('$escapedIcc')") } }
可选方案:Android端直接请求ASP.NET接口
如果不想在JS侧处理请求,也可以在Android端拿到条码值后直接发起网络请求调用ASP.NET后端接口,注意要和Web应用同步Cookie/鉴权凭证,避免权限校验失败。
内容的提问来源于stack exchange,提问作者Lucho Gizdov
相关产品推荐
相关产品推荐

