uni-app 设备序列号含特殊符号如空格时无法正常识别

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app 设备序列号含特殊符号如空格时无法正常识别

开发环境 版本号 项目创建方式
Mac 13.5 HBuilderX

操作步骤:

在本地定位了一下问题,在获取列表的代码逻辑中有执行adb的这两个命令:

  1. adb -s "MT95HC(5G)DC00411" shell getprop ro.build.version.release
  2. adb -s "MT95HC(5G)DC00411" shell getprop ro.product.cpu.abilist

当序列号“MT95HC(5G)DC00411”中带有特殊字符(本例为括号)时,命令需在序列号加双引号才能成功,否则会抛出异常信息。

预期结果:

正常识别出设备,并在设备列表中展示。

实际结果:

无法识别出设备,界面报无设备。

bug描述:

设备序列号:MT95HC(5G)DC00411。
通过adb devices 可以正常识别出设备为:

List of devices attached
MT95HC(5G)DC00411       device

但是在hbuilder的【运行->运行到手机或模拟器】面板中,无法识别出设备。


2 回复

重新定位了一下,bug原因是通过 adb devices 获取设备列表时,解析设备的正则存在问题,需要修正一下。代码在 AndroidLauncher 第 1318 行:
let mResultList = mResult.split(/xxxx/)


uni-app 中处理设备序列号时,如果序列号包含特殊符号如空格,可能会导致识别问题。为了解决这个问题,我们可以在获取序列号后,使用 JavaScript 对其进行预处理,以去除或替换这些特殊符号。以下是一个示例代码,展示了如何在 uni-app 中处理这种情况。

示例代码

  1. 获取设备序列号(模拟)

    假设我们有一个函数 getDeviceSerialNumber 来模拟获取设备序列号,这个函数会返回一个包含空格的字符串。

    function getDeviceSerialNumber() {
        // 模拟获取到的设备序列号,包含空格
        return "1234 5678 90AB CDEF";
    }
    
  2. 预处理序列号

    使用正则表达式或其他字符串处理方法去除或替换特殊符号(如空格)。

    function preprocessSerialNumber(serialNumber) {
        // 去除空格
        let processedSerialNumber = serialNumber.replace(/\s+/g, '');
        
        // 如果需要替换为其他字符,例如下划线
        // let processedSerialNumber = serialNumber.replace(/\s+/g, '_');
        
        return processedSerialNumber;
    }
    
  3. 使用处理后的序列号

    将处理后的序列号用于后续逻辑,比如显示、存储或发送请求。

    Page({
        onLoad: function() {
            // 获取设备序列号
            let rawSerialNumber = getDeviceSerialNumber();
            
            // 预处理序列号
            let processedSerialNumber = preprocessSerialNumber(rawSerialNumber);
            
            // 使用处理后的序列号
            console.log("原始序列号:", rawSerialNumber);
            console.log("处理后的序列号:", processedSerialNumber);
            
            // 例如,将处理后的序列号发送到服务器
            // this.sendSerialNumberToServer(processedSerialNumber);
        },
        
        sendSerialNumberToServer: function(serialNumber) {
            // 发送请求的代码
            uni.request({
                url: 'https://yourserver.com/api/saveSerialNumber',
                method: 'POST',
                data: {
                    serialNumber: serialNumber
                },
                success: function(res) {
                    console.log("序列号发送成功:", res.data);
                },
                fail: function(err) {
                    console.error("序列号发送失败:", err);
                }
            });
        }
    });
    

总结

通过上述代码,我们模拟了获取设备序列号、预处理序列号(去除空格或替换为其他字符)以及使用处理后的序列号的过程。这种方法可以有效地解决设备序列号包含特殊符号时无法正常识别的问题。在实际应用中,你可能需要根据具体的设备类型和平台调整获取序列号的逻辑。

回到顶部