这问题经常在鸿蒙系统上出现,之前在红米手机上出现过一次。真的是无力吐槽,明明写入的内容并不大,小到几十b,最大几十kb,总会提示1300202,但是获取微信的存储空间又是充足的,剩余接近10M,这不是逻辑死循环了吗
wx.getFileSystemManager在鸿蒙系统上,经常会出现1300202错误?const baseFilePath = `${wx.env.USER_DATA_PATH}/testStorge.json`; const storgSetFile = function (params) { var fs = wx.getFileSystemManager(); const txtSize = getTxtSize(JSON.stringify(params)); //首先获取需要写入的数据内容大小。ps:基本上数据内容都很小,不会超过100k,都是json格式数据 console.log('需要写入的文件大小:',txtSize) return new Promise(function(resolve, reject) { fs.access({ path: baseFilePath, success(res) { console.log('查询缓存文件成功--------') //正常流程,忽略 ... }, fail(res){ console.log('查询缓存文件失败--------') console.log('查询缓存文件错认信息',res) console.log('错认类型码',res.errno) ensureDirectoryForFile(baseFilePath).then(() => { createNewFile(baseFilePath, params,resolve); }).catch(err => { resolve({errCode: -1, msg: 'error', data: err}) }); }, }) }) } const getTxtSize = function(jsonString) { const charCount = jsonString.length; const encoder = new TextEncoder(); const utf8Size = encoder.encode(jsonString).length; return formatBytes(utf8Size); } function ensureDirectoryForFile(filePath) { return new Promise((resolve, reject) => { console.log('ensureDirectoryForFile 被调用,filePath:', filePath); const fs = wx.getFileSystemManager(); // 更安全的路径提取逻辑 let dirPath; try { // 确保 filePath 是字符串 if (typeof filePath !== 'string') { console.error('filePath 不是字符串:', filePath); reject(new Error('filePath 必须是字符串')); return; } // 从完整文件路径中提取目录路径 const lastSlashIndex = filePath.lastIndexOf('/'); if (lastSlashIndex !== -1) { dirPath = filePath.substring(0, lastSlashIndex); } else { // 如果没有斜杠,使用默认的用户数据路径 dirPath = wx.env.USER_DATA_PATH; } // 确保 dirPath 不为空 if (!dirPath) { dirPath = wx.env.USER_DATA_PATH; } } catch (error) { console.error('提取目录路径时出错:', error); dirPath = wx.env.USER_DATA_PATH; } // 最终验证和备用方案 if (!dirPath || typeof dirPath !== 'string') { console.error('最终 dirPath 无效,使用默认路径'); dirPath = wx.env.USER_DATA_PATH; } console.log('最终使用的目录路径:', dirPath); // 检查目录是否已经存在 fs.access({ path: dirPath, success: () => { console.log('目录已存在:', dirPath); resolve(); }, fail: () => { // 目录不存在,需要创建 fs.mkdir({ dirPath: dirPath, // 确保使用正确的参数名 recursive: true, success: () => { console.log('目录创建成功:', dirPath); resolve(); }, fail: (err) => { console.error('创建目录失败,详细错误:', JSON.stringify(err)); if (err.errMsg && err.errMsg.includes('already exists')) { console.log('目录已存在(通过失败信息检测):', dirPath); resolve(); } else { console.error('创建目录失败:', err); // 如果目录创建失败,尝试直接写入文件 console.log('尝试直接进行文件操作,忽略目录创建错误'); resolve(); } } }); } }); }); } function createNewFile(filePath, params, resolve) { const fs = wx.getFileSystemManager(); var main = {...params}; fs.writeFile({ filePath: filePath, data: JSON.stringify(main), encoding: 'utf8', success(res) { resolve(res); }, fail(res) { console.log('查询文件失败后,尝试写入新文件,写入缓存文件失败--------'); console.log('写入失败错误内容', JSON.stringify(res)); handleWriteFileError(res, resolve); } }); } // 新增辅助函数:统一处理写入文件错误 function handleWriteFileError(res, resolve) { if (res.errno == '1300202') { console.log('准备获取微信储存空间大小'); wx.getStorageInfo({ success: (succ) => { console.log('获取微信储存空间成功-------'); console.log(JSON.stringify(succ)); const remainingSpace = succ.limitSize - succ.currentSize; console.log(`剩余存储空间: ${remainingSpace}KB`); wx.showToast({ title: `当前微信存储空间大小为${remainingSpace/1024}MB,请先清理微信缓存`, icon: 'none', mask: true }); resolve({errCode: -1, msg: 'error', data: res}); }, fail(err) { wx.showToast({ title: '存储空间不足,或文件大小超出上限', icon: 'none', mask: true }); console.log(`获取存储空间失败`, JSON.stringify(err)); resolve({errCode: -1, msg: 'error', data: res}); } }); } else { resolve({errCode: -1, msg: 'error', data: res}); } } 前面为封装的wx.getFileSystemManager组件内容 截图为用户鸿蒙系统下,运行到文件缓存组件时,打印的日志信息。可以看出,在“fs.writeFile()”写入新文件时,会返回1300202 错误码,此时获取微信储存空间大小,得到接近10M的返回值,那么问题就来了,为什么在空间足够的情况下,写入新的缓存文件会提示空间不足的错误?这SB问题老是在鸿蒙系统上反反复复的出现,其他手机系统上倒是没反馈。不是,鸿蒙这系统怎么这么多问题啊,有没有靠谱的来把这个问题解决啦,客户经常遇到这个问题(目前我们给用户的解决方案是:先手动清除微信文件缓存,再重启小程序),每次这么搞真的是烦不胜烦 [图片]
11-21看来遇到这个BUG的同道不少。目前可以确定的是鸿蒙系统5.1.0+鸿蒙特供微信版本1.0.9必现这个BUG。当前我的解决方案是推翻原来的canvas组件以及绘制流程,重构成canvas2D方案和流程。好消息是这两种后者比前者api版本更新,可能在支持度上,比前者更好。同时,最重要的事,重构过程比较丝滑,主要是canvas对象实例的注册获取,以及ctx对象的操作语法有区别,相对应的改一下就可以了,整体业务流程大差不差,有特别需求差异的,建议问一下AI工具。祝大家开发顺利。 ps:微信这帮人对自己的api都不测试的嘛,特别是在新的操作系统上的适配问题,简直无语
wx.canvasToTempFilePath在鸿蒙系统5.1.0版本上转换出来的图片是黑屏?... //前面的canvas绘制图片流程是正常的(将canvas节点展示到可视区域调试过了) ctx.draw(false, () => { setTimeout(() => { _this.generateImage() },3000) }) //核心转换方法 generateImage(){ let _this = this; wx.nextTick(() => { wx.canvasToTempFilePath({ canvasId: 'firstCanvas', fileType: 'jpg', // 改用JPG格式 // quality: 0.8, // 适当降低质量 x:0, y:0, destWidth: _this.data.cw, // 明确设置输出尺寸 destHeight: _this.data.ch, success: async (res) => { ...// res.tempFilePath;这里返回的图片上传到后台后,回显发现是个纯黑色底图片,什么信息都没有。这个问题目前只出现在鸿蒙系统的手机上 //用户反馈,问题出现在鸿蒙系统的最新版本微信上 }, }, _this) }) } 这个问题不止一个用户遇到了,目前反馈到我这里的有两个用户,且操作系统都是鸿蒙5.1.0这个版本号,微信版本号都为:1.0.9。用户反馈都是在升级了微信最新版本后遇到这个问题。其中有一个客户已经提交了日志,但是智能客服一直不回复(微信这智能客服功能回复也太慢了) 后续:当前解决方案,重构成canvas2d; async toWaterImg(main){ const tempFilePath = main.file; const imgInfo = await this.getImageInfo(tempFilePath); const MAX_SIZE = 600; let canvasWidth = imgInfo.width; let canvasHeight = imgInfo.height; if (canvasWidth > MAX_SIZE || canvasHeight > MAX_SIZE) { const ratio = Math.min(MAX_SIZE / canvasWidth, MAX_SIZE / canvasHeight); canvasWidth = Math.floor(canvasWidth * ratio); canvasHeight = Math.floor(canvasHeight * ratio); } await new Promise(resolve => { this.setData({ cw: canvasWidth, ch: canvasHeight }, resolve); }); //水印流程 await this.drawFullImage(tempFilePath); //转换成base64文件 const dataUrl = canvas.toDataURL('image/jpg'); //再将base64转换成本地文件路径 const tempPath = await this.base64ToTempPath(dataUrl); //压缩流程,如果不需要压缩的,可以直接前面tempPath上传 const nTpath = await this.testCompress(tempPath); // wx.getFileSystemManager().getFileInfo({ // filePath: nTpath, // success: (info) => { // const sizeKB = (info.size / 1024).toFixed(2); // console.log(`文件大小: ${sizeKB} KB`); // } // }); //上传流程 await this.addFile(nTpath); //销毁实例 await this.destoryCvs(); }, // 获取图片信息 getImageInfo(filePath) { return new Promise((resolve, reject) => { wx.getImageInfo({ src: filePath, success: (res) => resolve(res), fail: (err) => reject(err) }); }); }, //base64转换为本地文件路径 base64ToTempPath(base64Data) { return new Promise((resolve, reject) => { // 1. 提取纯Base64数据(移除头部信息) const base64Str = base64Data.replace(/^data:image\/\w+;base64,/, ''); // 2. 将Base64转换为ArrayBuffer const arrayBuffer = wx.base64ToArrayBuffer(base64Str); // 3. 生成唯一文件名 const filePath = `${wx.env.USER_DATA_PATH}/temp_${Date.now()}.png`; console.log(filePath) // 4. 写入文件 wx.getFileSystemManager().writeFile({ filePath, data: arrayBuffer, encoding: 'binary', success: () => resolve(filePath), fail: (err) => reject('写入失败:' + err.errMsg) }); }) },
08-26localStorage存本地缓存有大小限制(这个限制有多少我记不清了,是20M还是200M来着),如果缓存空间被用完了就会存储失败,现在的手机像素那么高,拍几张照片就用光了,所以建议替换成文件缓存功能吧,查一下小程序文档。网上找个读写文件缓存的封装模块搬过来,和本地缓存一样用
小程序local storage 个别手机存储不了数据?小程序local storage 有些手机存储不了数据,清除小程序缓存重新进入,手机内存也是充足的,就是数据丢失
08-12chooseMedia这个api我遇到的情况是,在调用完成的回调内直接this.setData会报错[图片] 好,那么我就针对这个报错,在调用chooseMedia之前申明一个_this对象来保存一下当前this对象,来保证返回的文件路径能正常更新到data,以便后续操作使用,代码如下: [图片] 。但是这就遇到另一个问题了:当我调用后续方法subNewImg(),并在方法内部去获取this.data.filePath的时候,发现无法正常获取,data内的filePath参数仍然是初始化的null。我猜想chooseMedia内setData只对它自身的作用域有效,所以做了如下修改: [图片] 这样,在后续方法subNewImg内是能收到返回的文件路径,直接this.data.filePath就获取不到...就离谱
使用wx.chooseMedia成功之后显示图片但是wx.uploadFile 接口没有调用?wx.chooseMedia调用成功了拿到了图片的路径图片也显示成功了,然后服务器那边没有显示调用了wx.uploadFile这个接口,有的手机会出现这个问题有的不会 [图片][图片]
01-0323/12月份也遇到了,还是没解决
navigationbartitletext如何设置让标题居中?在真机调试下顶部的bar文字自动跑到手机最左侧,如何设置其顶部bar像开发工具预览一样顶部居中呢?
2023-12-07同遇到了,而且只有体验版才会有这个问题,线上环境倒没有。这微信一天天的不干正事
getLocation:fail privacy permission is not author?获取位置信息接口 以及获取用户信息按钮 提示getUserProfile:fail privacy permission is not authorized 没有权限 今天才这样的, 这是什么问题? 都开发不了了
2023-08-16一年过去了,还是这逼样。用户一靠卡片就莫名其妙的弹一些类似于公交卡的其他应用出来——这个优先级就不能好好解决一下嘛?总是搞出这种半吊子的破玩意出来,你要不就别整这些花里胡哨的玩意也可以啊?用户一有问题就把压力给到我们开发者,人用户问我为什么苹果手机不能用,我怎么回答?我能怎么办?作为一个开发工具,做成这个鸟样都能活下来,你真的应该感恩国内这变态的开发环境,你让我们这些开发者怎么能爱的起来?
NFC贴卡后,总是先调用手机自带的NFC弹框,如何能够在小程序里面禁止手机其他具有NFC的功能弹出。使用华为NFC 还好, 使用小米手机的时候NFC ,手机NFC 感应非常迅速, 就直接调用了,手机自带的NFC,这样我小程序页面的NFC 就执行不了了。 请问 有没有办法 在小程序页面只调用 当前的NFC功能, 不弹出手机自带的。
2022-10-25我找到算是答案的答案了:问了写后台的同事,文件操作只能创建、读取、删除,无法像编程语言内操作对象那样去修改。要实现修改写入的需求,只能先删除原文件,然后重新创建一个同名的新文件去替换......,估计这个api就是基于这个思路来实现的,所以没有类似于updataFile这样的api
FileSystemManager如何修改写入的文件内容?如题:我调用FileSystemManager这个api写入了一个logs.json文件,里面保存有用户的操作记录(json字符串,用作回显缓存),当我在某个页面去获取到这个json文件的内容后,我需要修改里面的某些内容,实现对这个json文件内容的更新,如何实现?我在手册上面没有找到updataFile这样的api,难道只能先删除之后再重新写入?
2022-07-28目前已经排查到原因了,应该是缓存的mcLiftInfo对象在上下文中的某个地方闭包了——我在存入缓存的地方把key换成mcLiftInfoNew之后,在控制台发现缓存是更新了的也就是说mcLiftInfo这个key指向的缓存对象被某个地方给‘挟持’了,修改赋值受影响了。还得重新理一次上下文
小程序缓存存取的时候数据更新不及时?我在代码上下文中有一个存入缓存的步骤: ... examInfo.signInfo = '123';//res.data.mcSign;//假设当前对象的signInfo属性值为123 console.log(examInfo);//输出{...signInfo:123} wx.setStorageSync('mcLiftInfo', examInfo);//写入缓存mcLiftInfo对象 console.log(wx.getStorageSync('mcLiftInfo'));//能够正常获取缓存数据,{...signInfo:123} 但是在开发工具调试器上,storage中,发现当前缓存的字段mcLiftInfo中signInfo属性并没有更新赋值。然后在销毁页面的钩子函数中,获取缓存信息mcLiftInfo中同样没有signInfo属性——这就导致了后续流程出现问题 问:如何能够避免这种情况?让缓存在写入的时候能够实时更新,保证在获取缓存的时候,数据都是最新的? 补充截图: (1)//前文代码片段在控制台的输出效果,会发现缓存的mcLiftInfo对象中signInfo是已经成功赋值了: [图片] (2)//是控制台storage工具中的信息截图,mcLiftInfo中并没有signInfo属性: [图片]
2022-04-28另外补充一点:截图的后续流程是获取到经纬度后,调用腾讯地图的小程序sdk“reverseGeocoder”这个核心类,传入获得的经纬度之后发现附近列表也没有返回这个地址(重庆市黔江区中央公园城)。刚开始以为是由于最开始定位不精确导致的,后续调试的时候通过腾讯地图的坐标拾取器拾取该地址坐标(该目标地址的正确经纬度)后传入该核心类仍然无法在返回的poi列表里面获取到该地址项!
wx.getLocation获取位置不准确(已开启高精度,坐标系也设置成gcj02)?如题,在用户使用中,获取定位信息wx.getLocation的api在某个特定地方一直定位不准确(根据用户反馈,就在这一个地方一直定位不了,偏差几百上公里的误差);但是用户自己使用微信分享地址功能又能够正确获取该地址(重庆市黔江区中央公园城)。开发代码截图如下: [图片] 第一个红圈处为api参数信息,第二个红圈处为设置map组件的marker位置。根据用户反馈,其他地区定位正常,唯独单单该地址(重庆市黔江区中央公园城)一直定位不了,一直有偏差,并且每次偏差后的位置不相同
2021-12-17