uni-app compressVideo、getFileInfo在Android端不支持content协议
uni-app compressVideo、getFileInfo在Android端不支持content协议
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 11 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:11
HBuilderX类型:正式
HBuilderX版本号:4.75
手机系统:Android
手机系统版本号:Android 15
手机厂商:华为
手机机型:HLK-AL00
页面类型:vue
vue版本:vue3
打包方式:云端
项目创建方式:HBuilderX
### 示例代码:
```ts
uni.chooseMedia({
sourceType: ['album'],
count: 9,
mediaType: ['video'],
maxDuration: 60,
camera: 'back',
success: res => {
console.log('source', res.tempFiles);
uni.getFileInfo({
filePath: res.tempFiles[0].tempFilePath,
success: res2 => {
console.log('success', res2);
},
fail: err2 => {
console.log('fail', err2);
},
})
uni.compressVideo({
src: res.tempFiles[0].tempFilePath,
quality: 'low',
success: res3 => {
console.log('success', res3);
},
fail: err3 => {
console.log('fail', err3);
},
complete: over => {
console.log('complete', over);
}
});
},
});
source输出:
[
{
"height": 1920,
"thumbTempFilePath": "/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/temp/uni-media/video_thumb_1754358034902.jpg",
"fileType": "video",
"duration": 1.26,
"width": 1080,
"tempFilePath": "content://com.android.providers.media.documents/document/video%3A8479",
"byteSize": 2274965,
"size": 2221.646
}
]
uni.getFileInfo fail 输出
{
"errMsg": "getFileInfo:fail 文件不存在",
"code": -4
}
操作步骤:
先调用chooseMedia选择视频。再使用compressVideo压缩选择的视频。
预期结果:
压缩视频成功。
实际结果:
uni.getFileInfo 提示文件不存在
uni.compressVideo 无响应。
bug描述:
uni.compressVideo、uni.getFileInfo 函数不支持content协议。
更多关于uni-app compressVideo、getFileInfo在Android端不支持content协议的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
这个bug确认了么?什么时候能修复?
更多关于uni-app compressVideo、getFileInfo在Android端不支持content协议的实战教程也可以访问 https://www.itying.com/category-93-b0.html
官方答复一下呢。。
这是一个已知的Android平台兼容性问题。content://协议是Android系统用于跨应用文件共享的URI方案,但uni-app的部分API在处理这类协议时存在限制。
问题分析:
uni.chooseMedia返回的tempFilePath使用了content://协议,这是Android系统的标准行为uni.getFileInfo和uni.compressVideo目前无法直接处理content://协议的路径- 这导致文件操作API无法正确识别和访问通过内容URI指定的文件
临时解决方案:
- 对于视频文件,建议使用
uni.chooseVideo替代uni.chooseMedia,它通常返回文件路径而非内容URI - 如果需要使用
uni.chooseMedia,可以先将文件保存到应用沙箱目录:
uni.chooseMedia({
success: async res => {
const tempFilePath = res.tempFiles[0].tempFilePath;
// 将content URI转换为可访问的文件路径
const savedFilePath = await saveFileToSandbox(tempFilePath);
// 使用转换后的路径进行操作
uni.compressVideo({
src: savedFilePath,
// ...其他参数
});
}
});
function saveFileToSandbox(contentUri) {
return new Promise((resolve, reject) => {
plus.io.resolveLocalFileSystemURL(contentUri, entry => {
entry.file(file => {
const fileReader = new plus.io.FileReader();
fileReader.readAsDataURL(file);
fileReader.onloadend = e => {
// 将文件保存到应用沙箱
const sandboxPath = '_downloads/' + Date.now() + '.mp4';
plus.io.resolveLocalFileSystemURL(sandboxPath, sandboxEntry => {
sandboxEntry.createWriter(writer => {
writer.write(e.target.result);
writer.onwriteend = () => resolve(sandboxPath);
});
});
};
});
});
});
}

