uni-app 三星、部分小米手机设备id获取不对

uni-app 三星、部分小米手机设备id获取不对

示例代码:

{
"errMsg": "getSystemInfoSync:ok",
"brand": "samsung",
"model": "SM-G970U1",
"pixelRatio": 3,
"screenWidth": 360,
"screenHeight": 712,
"windowWidth": 360,
"windowHeight": 712,
"statusBarHeight": 39,
"language": "zh-CN",
"system": "10",
"version": "1.9.9.80788",
"fontSizeSetting": "",
"platform": "android",
"SDKVersion": "",
"windowTop": 0,
"windowBottom": 0,
"safeArea": {
"left": 0,
"right": 360,
"top": 39,
"bottom": 712,
"width": 360,
"height": 673
},
"safeAreaInsets": {
"top": 39,
"right": 0,
"bottom": 0,
"left": 0
},
"deviceId": "||020000000000|5a679ca9c43dfdd1|040ed427b3714ab183d2fd3d67a31462|"
}

操作步骤:

const res = uni.getSystemInfoSync();
console.log("客户端信息={}",res)
console.log("设备id={}",res.deviceId)
// 设备id
uni.setStorageSync("deviceId", res.deviceId)

预期结果:

获取正常的32位设备id

实际结果:

获取超出32位的字符串:

||020000000000|53c15b920bb26b0c|311f841c4e4941d1b77c809efb8181bf|
||020000000000|f85b1cf4ec16303e|493e1dbd33c24786bc4b5ddf0e710765|
|null|020000000000|f85b1cf4ec16303e|493e1dbd33c24786bc4b5ddf0e710765|
|||c289c23f0a5f5509|df49eb0960b741af990f461a8177348f|

bug描述:

我这边获取设备id,目前直接使用了官方提供的api:uni.getSystemInfoSync().deviceId获取, 使用:此方法在main.js入口文件执行,获取成功后使用uni.setStorageSync去持久化, 部分型号出现了以下情况,andorid机,

||020000000000|f85b1cf4ec16303e|493e1dbd33c24786bc4b5ddf0e710765|

请问下什么情况下获取值是这样?如果出现这种情况,需要自己截取吗?


更多关于uni-app 三星、部分小米手机设备id获取不对的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

基座首次安装是这么一长串,然后你再次启动基座,就会正常,我遇见的是这个问题,不知道你遇见的是不是同样的问题,

更多关于uni-app 三星、部分小米手机设备id获取不对的实战教程也可以访问 https://www.itying.com/category-93-b0.html


是的,这种情况我也遇到过;不过不仅仅是基座包,打的正式包我也遇到了这种情况…,再次打包有可能也能解决,但也是概率问题…

回复 1***@qq.com: android设备我目前不管正式包还是基座包,全是这样的,

请问后续是怎么解决的

应该是个bug,官方的没有回复,目前还没解决

暂时没有解决,等官方修复吧,不敢用现在

我也遇到这样问题

plus.device.getInfo({ success: (e) => { console.log(e.uuid); this.$Toast.toast(e.uuid, 2) },

在三星和部分小米手机上获取到异常格式的deviceId,这是由于Android系统底层设备标识符机制差异导致的。

uni.getSystemInfoSync().deviceId 底层调用的是Android系统的ANDROID_ID,不同厂商对此标识符的实现存在差异。你看到的格式包含多个竖线分隔的字段,这是某些厂商自定义的设备标识格式。

对于这种异常格式,建议进行规范化处理:

let deviceId = uni.getSystemInfoSync().deviceId;

// 处理异常格式
if (deviceId && deviceId.includes('|')) {
    const parts = deviceId.split('|').filter(part => part && part !== 'null' && part !== '020000000000');
    if (parts.length > 0) {
        // 取最后一个有效部分作为设备ID
        deviceId = parts[parts.length - 1];
    }
}

// 验证是否为32位十六进制字符串
if (deviceId && /^[a-fA-F0-9]{32}$/.test(deviceId)) {
    uni.setStorageSync("deviceId", deviceId);
} else {
    // 备用方案:生成随机设备ID
    deviceId = this.generateFallbackDeviceId();
    uni.setStorageSync("deviceId", deviceId);
}
回到顶部