书接上文《踩坑系列之海信安卓设备获取UUID》,这个问题还是没有解决。即使采用获取设备信息的方式获取的唯一码,同批次设备还是一样的,既然这样,那就只能使用终极方案。自己管理唯一标识。
上文中提到过的方案4,当时是以为有些麻烦,因为要h5和app进行交互。经过查找资料,以及实际验证,完全可以在H5中直接处理。有以下两种方案。
方案一
使用html5和js实现,利用FileReader和FileWriter实现文件的读写,具体参考《HTML5来实现本地文件读取和写入的实现方法》
此方案未经采用,使用环境为APP,文中描述的以浏览器环境为主。如果是windows模式的智慧屏想实现本地唯一码,倒是可以采用这种方式。
方案二
使用html5plus的native.js,实现文件的读写。参考了网友的提供的资料,非常感谢。《分享下安卓下文件和目录的读取,写入,移动,删除》
这个方案非常合适,完美解决问题。
具体实现代码
// 生成本地uuid function generateLocalUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : (r & 0x3 | 0x8) return v.toString(16) }) } function getSerialNoByLocal() { // 只能用于安卓 导入java类 const File = window.plus.android.importClass('java.io.File') const BufferedReader = window.plus.android.importClass('java.io.BufferedReader') const FileReader = window.plus.android.importClass('java.io.FileReader') const FileWriter = window.plus.android.importClass('java.io.FileWriter') // 安卓11以下 /sdcard/自己的文件夹/1.txt // 安卓11 建议用 /storage/emulated/0/Download/自己的文件夹/1.txt // 读取txt文件 readFile ("/sdcard/修止符/配置.json") const readFile = (fileName) => { const readFr = new File(fileName) try { const reader = new BufferedReader(new FileReader(readFr)) let txt let retxt = '' let flag = true while (flag) { txt = reader.readLine() // 读取文件 if (txt == null) { flag = false break } retxt = retxt + txt } return retxt } catch (e) { console.log(e) return '' } } // 写文件 writeFile("/sdcard/修止符/配置.json",{"主键":"值"}) const writeFile = (fileName, res) => { res = res ? JSON.stringify(res) : '' // 对象转换为json文本 try { // 不加根目录创建文件(即用相对地址)的话directory.exists()这个判断一值都是false const n = fileName.lastIndexOf('/') if (n !== -1) { const fileDirs = fileName.substring(0, n) const directory = new File(fileDirs) if (!directory.exists()) { directory.mkdirs() // 不存在创建目录 } } const file = new File(fileName) if (!file.exists()) { file.createNewFile() // 创建文件 } const fos = new FileWriter(fileName, false) fos.write(res) fos.close() return true } catch (e) { console.log(e) return false } } const uuidPath = '/sdcard/wisdomApp/uuid.txt' // 首先读取文件 let uuid = readFile(uuidPath) // 如果文件内容为空 if (!uuid) { // uuid为空 则随机生成 uuid = generateLocalUUID() // 写入文件 writeFile(uuidPath, uuid) } // 返回uuid return uuid }
生成的唯一码路径
生成的文件内容
发表评论