Android调用JS方法没反应

本文记录了解决安卓调用JS方法不响应的问题过程。通过在方法名前后添加单引号转义字符并保持适当空格,成功实现了安卓与JS的交互。此经验分享有助于避免同类错误。

最近项目中有一个安卓与JS交互的功能,安卓调用Js方法,总是不走,我的最初方法是:

这样一直不走JS方法,找了好久,都一头雾水,心态快炸了,就去厕所冷静了十分钟,心静下来,想了想我调的是一个方法,如果是原生的方法,字符串我是要加引号的,是不是这里也一样呢,就这样,我死马当活马医,抱着试试的心态,改改试试,如下:

在字符串参数前面和后面加了个单引号转义字符,奇迹出现了,终于走通了,真的是被自己蠢哭了,记录一下,希望大家不要和我一样,被蠢哭。

备注:1.参数前面引号与左括号(之间放个空格,参数后面引号与右括号)之间放个空格,亲自试过没有空格,有些时候也调不通,有空格就一定可以调通,具体原因有待进一步探索。

          2.有些时候(比如参数是整形),就不需要加转义字符,但最好空格还是加上。

 

### 蓝牙打印无反应的调试与优化 在使用 Uni-App 进行蓝牙打印时,如果调用 `print()` 或 `bluetoothSocket.connect()` 后反应,可能是由于以下几个原因导致:设备连接失败、数据未正确发送、权限配置问题或编码方式不匹配。可以通过日志记录、错误处理增强和异步控制来提高代码的健壮性和可调试性。 #### 1. 检查蓝牙连接状态 在调用 `connect()` 方法之前,应确保目标设备是已配对状态,并且蓝牙适配器处于开启状态。以下是一个增强后的连接检测逻辑: ```javascript const printSomething = function(dev, res) { var that = this; var main = plus.android.runtimeMainActivity(); var BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter'); var UUID = plus.android.importClass('java.util.UUID'); var uuid = UUID.fromString('00001101-0000-1000-8000-00805F9B34FB'); var BAdapter = BluetoothAdapter.getDefaultAdapter(); if (!BAdapter.isEnabled()) { uni.showToast({ title: '请先开启蓝牙', icon: 'none' }); return; } var device = BAdapter.getRemoteDevice(dev.address); plus.android.importClass(device); if (!device.getBondState() === device.BOND_BONDED) { uni.showToast({ title: '设备未配对,请先配对', icon: 'none' }); return; } var bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid); plus.android.importClass(bluetoothSocket); console.log('开始连接打印机:' + dev.name); bluetoothSocket.connect(); if (bluetoothSocket.isConnected()) { console.log('设备已连接,开始发送打印文件'); uni.showToast({ title: '开始打印,请稍等', icon: 'none' }); var outputStream = bluetoothSocket.getOutputStream(); plus.android.importClass(outputStream); printTest(outputStream, res); bluetoothSocket.close(); if (!bluetoothSocket.isConnected()) { Api.closeLoading(); console.log('设备已关闭'); } } else { uni.showToast({ title: '设备连接失败,请检查打印机', icon: 'none', duration: 2000 }); } }; ``` 该段代码通过检查蓝牙适配器是否启用以及目标设备是否已配对,提前避免了无效连接尝试的发生[^1]。 #### 2. 异常处理与日志输出 为了更清晰地定位问题,应在关键步骤中加入异常捕获机制,并输出详细的日志信息。例如,在建立连接或写入数据时捕获异常并提示用户: ```javascript try { bluetoothSocket.connect(); } catch (e) { console.error('连接失败:', e); uni.showToast({ title: '连接失败,请重试', icon: 'none' }); return; } if (bluetoothSocket.isConnected()) { try { var outputStream = bluetoothSocket.getOutputStream(); plus.android.importClass(outputStream); printTest(outputStream, res); } catch (e) { console.error('获取输出流失败:', e); uni.showToast({ title: '获取输出流失败', icon: 'none' }); } } ``` 这样可以有效识别出连接成功但无法写入数据的问题,并提供相应的反馈。 #### 3. 分包发送与延时控制 当一次性发送大量文本或图片数据时,可能会因为缓冲区溢出而导致部分数据丢失。为了避免这种情况,可以采用分包发送的方式,并在每次发送之间加入适当的延迟: ```javascript async function printTest(outputStream, res) { const data = res.replace(/\\r\\n/g, '\n').replace(/\\n/g, '\n'); const arrayBuffer = plus.android.invoke(data, 'getBytes', 'gbk'); const chunkSize = 20; let pos = 0; const totalBytes = arrayBuffer.length; while (pos < totalBytes) { const endPos = Math.min(pos + chunkSize, totalBytes); const tempBuffer = arrayBuffer.slice(pos, endPos); pos += chunkSize; await delay(150); // 延迟发送 outputStream.write(tempBuffer); } outputStream.flush(); } function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } ``` 此方法通过限制单次发送的数据长度并引入延迟来降低数据传输速率,从而避免因数据过载而导致的内容偏移问题。 #### 4. 编码一致性验证 某些 ESC/POS 打印机要求特定的编码格式(如 GBK),若前后端使用的编码方式不一致,则可能导致乱码或无响应。因此,确保字符串转换为字节数组时使用正确的编码非常重要: ```javascript const arrayBuffer = plus.android.invoke(data, 'getBytes', 'gbk'); ``` 以上代码片段展示了如何将字符串以 `GBK` 格式转换为字节数组,以确保与打印机支持的编码格式保持一致。 --- ### 示例:完整的打印函数封装 结合上述优化策略,最终可以封装一个更健壮的打印函数如下: ```javascript async function printTest(outputStream, res) { const data = res.replace(/\\r\\n/g, '\n').replace(/\\n/g, '\n'); const arrayBuffer = plus.android.invoke(data, 'getBytes', 'gbk'); const chunkSize = 20; let pos = 0; const totalBytes = arrayBuffer.length; while (pos < totalBytes) { const endPos = Math.min(pos + chunkSize, totalBytes); const tempBuffer = arrayBuffer.slice(pos, endPos); pos += chunkSize; await delay(150); // 延迟发送 outputStream.write(tempBuffer); } outputStream.flush(); } function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } const printSomething = function(dev, res) { var that = this; var main = plus.android.runtimeMainActivity(); var BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter'); var UUID = plus.android.importClass('java.util.UUID'); var uuid = UUID.fromString('00001101-0000-1000-8000-00805F9B34FB'); var BAdapter = BluetoothAdapter.getDefaultAdapter(); if (!BAdapter.isEnabled()) { uni.showToast({ title: '请先开启蓝牙', icon: 'none' }); return; } var device = BAdapter.getRemoteDevice(dev.address); plus.android.importClass(device); if (!device.getBondState() === device.BOND_BONDED) { uni.showToast({ title: '设备未配对,请先配对', icon: 'none' }); return; } var bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid); plus.android.importClass(bluetoothSocket); console.log('开始连接打印机:' + dev.name); try { bluetoothSocket.connect(); } catch (e) { console.error('连接失败:', e); uni.showToast({ title: '连接失败,请重试', icon: 'none' }); return; } if (bluetoothSocket.isConnected()) { console.log('设备已连接,开始发送打印文件'); uni.showToast({ title: '开始打印,请稍等', icon: 'none' }); var outputStream = bluetoothSocket.getOutputStream(); plus.android.importClass(outputStream); try { printTest(outputStream, res); } catch (e) { console.error('打印过程中发生错误:', e); uni.showToast({ title: '打印失败,请检查设备', icon: 'none' }); } bluetoothSocket.close(); if (!bluetoothSocket.isConnected()) { Api.closeLoading(); console.log('设备已关闭'); } } else { uni.showToast({ title: '设备连接失败,请检查打印机', icon: 'none', duration: 2000 }); } }; ``` --- ### 相关问题 1. 如何实现Uni-App中的蓝牙设备自动重连功能? 2. 在Uni-App中如何处理蓝牙连接状态变化的通知? 3. 使用Uni-App进行蓝牙通信时遇到连接不稳定怎么办?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值