uni-app安卓13 安卓app自启动后使用uni.chooseImage拍照返回的路径没法上传
uni-app安卓13 安卓app自启动后使用uni.chooseImage拍照返回的路径没法上传
产品分类:uniapp/App
| 项目 | 内容 |
|---|---|
| PC开发环境操作系统 | Windows |
| PC开发环境操作系统版本号 | win11 25H2 |
| HBuilderX类型 | 正式 |
| HBuilderX版本号 | 5.05 |
| 手机系统 | Android |
| 手机系统版本号 | Android 13 |
| 手机机型 | F88 |
| 页面类型 | vue |
| vue版本 | vue2 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
bug描述
平板开机后,app也自启动,使用uni.chooseImage拍照点击确定,返回的tempFilePaths的地址是data/user/0/uni.UNIC5061EF/apps/_UNI_C5061EF/doc/uniapp_temp_1779435550420/camera/1779435555622.jpg 这种,无法压缩,无法上传,压缩报错找不到这个文件
把app进程关掉重新打开,返回的是_doc/uniapp_temp_1779671343139/camera/1779671361224.jpg,这个可以正常压缩上传,
请问一下,我如果想保留自启动这个功能的情况下,改怎么修改才能让uni.chooseImage拍照返回_doc/uniapp_temp_1779671343139/camera/1779671361224.jpg这种路径
选择相册的照片是正常的,就是拍照不行
示例代码
uni.chooseImage({
count: 6, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: function (res) {
console.log(JSON.stringify(res.tempFilePaths));
}
});
更多关于uni-app安卓13 安卓app自启动后使用uni.chooseImage拍照返回的路径没法上传的实战教程也可以访问 https://www.itying.com/category-93-b0.html
let realPath = plus.io.convertLocalFileSystemURL(res.tempFilePaths[0]);
console.log(‘转换后的路径:’, realPath);
catch 报错 文件不存在
更多关于uni-app安卓13 安卓app自启动后使用uni.chooseImage拍照返回的路径没法上传的实战教程也可以访问 https://www.itying.com/category-93-b0.html
欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
好的,收到您的 bug 反馈。作为 DCloud 官方人员,我对这个反馈进行如下评审:
一、 bug 反馈内容完整性评审
- BUG 描述: 描述非常清晰和详细。您准确地指出了问题的关键——在特定场景(平板开机,App 自启动)下,uni.chooseImage 拍照返回的临时文件路径是绝对路径(以 data/user/0/… 开头),而不是相对路径(以 _doc/… 开头)。并且明确说明了这个绝对路径导致后续的压缩和上传操作失败,而关闭 App 后重新打开则恢复正常。官方人员能够完全理解您所描述的问题。
- 代码示例: 提供的代码示例不完整,存在误导。您提供的示例中 sourceType: [‘album’] 表示仅从相册选择,这与您描述的“拍照”问题场景不一致。为了更准确地复现问题,您应该提供一个 sourceType: [‘camera’] 或 [‘album’, ‘camera’] 的示例。不过,从您的文字描述中,我们可以清晰地知道您是在使用拍照功能。
- 复现步骤: 复现步骤非常清晰:“安卓13的平板 启动后app自启,点击上传触发uni.chooseImage拍照”。这是一个非常明确的操作路径,结合您的描述,官方人员能够根据此步骤尝试复现问题。
- 预期结果 & 实际结果: 预期结果是返回 _doc/… 这样的相对路径,这是合理的。实际结果是返回了完整的绝对路径,这与正常情况下的行为不符,因此不是一个误报。
- 分类信息:
分类信息填写得非常完整,包含了 HBuilderX版本、手机OS平台、系统版本、Vue版本、手机设备机型 等关键信息,这非常有助于我们定位问题。
综合评价: 这是一个高质量的 bug 反馈,问题描述、复现步骤和环境信息都非常清晰。唯一的瑕疵是代码示例与文字描述略有出入,但不影响对问题核心的理解。
二、 bug 是否成立分析 该 bug 成立。
问题核心:您遇到的路径问题,是 Android 系统在特定条件下(如自启动)授予应用的文件访问权限范围不同导致的。在自启动等特殊场景下,系统返回的可能是应用私有目录的绝对路径,而不是 uni-app 应用沙箱内可预期的相对路径。
知识库依据:在 ask 社区知识库中,我找到了一个与您问题高度相似的反馈:【报Bug】拍照片,返回的图片地址不对,_doc/uniapp_temp_1630048144168/camera/photo_001.jpg。在该问题中,用户同样遇到了路径问题,最终的解决方案之一是使用 plus.io.convertLocalFileSystemURL 方法对返回的路径进行转换。
替代/兼容方案:为了保证在各种启动场景下的稳定性,建议您在获得 uni.chooseImage 返回的路径后,统一使用 plus.io.convertLocalFileSystemURL 进行处理,将其转换为应用可用的文件系统URL。这是一个标准的兼容性处理方案。
三、 基本概念问题分析
您的问题不属于基本概念问题,而是特定平台(Android)在特定场景(自启动)下的一个兼容性现象。
解决方案建议
使用路径转换(推荐):无论路径是绝对路径还是相对路径,在 App 端进行上传或压缩等文件操作前,都使用 plus.io.convertLocalFileSystemURL 进行一次转换,以确保路径的有效性。
uni.chooseImage({
count: 6,
sizeType: [‘original’, ‘compressed’],
sourceType: [‘camera’], // 根据您的场景,这里应是 camera 或两者皆有
success: function (res) {
// 转换路径
let realPath = plus.io.convertLocalFileSystemURL(res.tempFilePaths[0]);
console.log(‘转换后的路径:’, realPath);
// 使用 realPath 进行后续的压缩和上传操作
uni.uploadFile({
url: '您的上传接口',
filePath: realPath,
name: 'file',
// ... 其他参数
success: (uploadRes) => {
console.log('上传成功', uploadRes);
},
fail: (err) => {
console.error('上传失败', err);
}
});
}
});
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
使用 uni.chooseMedia (备选):可以尝试使用更新的 uni.chooseMedia API,它在一些路径处理上可能更统一,但仍建议结合路径转换使用以确保万无一失。
感谢您提供如此详细的反馈,这将帮助我们不断优化产品。您可以尝试上述方案,看能否在保留自启动功能的同时解决问题。 内容为 AI 生成,仅供参考
这个问题是因为 app 自启动时,应用的文件系统上下文尚未完全初始化,导致 uni.chooseImage 返回的相机拍照路径是 data/user/0/... 这种绝对路径,而非标准的 _doc/uniapp_temp... 相对路径。而相册选取走的是系统媒体库,路径映射正常,所以没有此问题。
根本原因是原生层在自启动后临时目录的 symlink 或文件映射未正确建立,uni.chooseImage 直接返回了真实物理路径。要解决该问题,可以:
- 在成功回调中手动转换路径:对
tempFilePaths中的绝对路径,使用plus.io.convertAbsoluteFileSystemPath或plus.io.resolveLocalFileSystemURL将其转换为可操作的文件对象,再读取数据上传。 - 使用
uni.saveFile保存临时文件:将拍照返回的绝对路径文件复制到应用的标准临时目录下,再用新路径上传。 - 延迟调用或强制刷新上下文:在
App.vue的onLaunch中确保文件系统就绪(如plus.io.requestFileSystem),再调用chooseImage。
示例处理代码(在回调中处理绝对路径):
uni.chooseImage({
sourceType: ['camera'],
success: (res) => {
let path = res.tempFilePaths[0];
// 如果是绝对路径,转换成相对路径或复制
if (path.startsWith('/')) {
plus.io.resolveLocalFileSystemURL(path, (entry) => {
// 使用 entry.toLocalURL() 得到可用的 URL
let usablePath = entry.toLocalURL();
// 后续上传用此路径
});
} else {
// 正常相对路径直接使用
}
}
});

