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在处理这类协议时存在限制。

问题分析:

  1. uni.chooseMedia返回的tempFilePath使用了content://协议,这是Android系统的标准行为
  2. uni.getFileInfouni.compressVideo目前无法直接处理content://协议的路径
  3. 这导致文件操作API无法正确识别和访问通过内容URI指定的文件

临时解决方案:

  1. 对于视频文件,建议使用uni.chooseVideo替代uni.chooseMedia,它通常返回文件路径而非内容URI
  2. 如果需要使用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);
            });
          });
        };
      });
    });
  });
}
回到顶部