You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11中使用SiliCompressor压缩视频无法保存文件问题

问题排查与修复方案

核心问题:目标路径传的是文件夹而非具体文件

SiliCompressor的compressVideo方法第二个参数要求传入完整的目标文件路径(包含文件名),你现在传的是文件夹路径,压缩后的视频没有指定存储的文件名,自然无法保存。

修复代码示例:

先从原视频路径提取文件名,生成带后缀的目标文件路径:

CoroutineScope(Dispatchers.IO).launch {
    var videoPath = ""
    try {
        val targetFolder = compressVideosFolderPath
        if (!targetFolder.exists()) {
            targetFolder.mkdirs()
        }
        // 从原视频路径strType提取文件名,生成压缩后的文件名
        val originalFile = File(strType)
        val compressedFileName = "${originalFile.nameWithoutExtension}_compressed.mp4"
        val targetFilePath = File(targetFolder, compressedFileName).absolutePath
        
        videoPath = SiliCompressor.with(applicationContext)
            .compressVideo(strType, targetFilePath)
        Log.d("TAG", "压缩完成,路径:$videoPath")
    } catch (e: URISyntaxException) {
        Log.e("TAG", "URI格式错误: ${e.message}")
        e.printStackTrace()
    } catch (e: IOException) {
        Log.e("TAG", "IO异常: ${e.message}")
        e.printStackTrace()
    } catch (e: Exception) {
        Log.e("TAG", "压缩失败: ${e.message}")
        e.printStackTrace()
    }
}

额外排查点:存储权限问题

如果是Android 10(API 29)及以上版本:

  • 直接操作公共Downloads目录需要申请MANAGE_EXTERNAL_STORAGE权限,在Manifest里添加:
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    
    然后在代码中动态请求该权限。
  • 或者改用应用专属存储目录,避免权限问题:
    // 应用内部存储的Downloads目录,无需额外权限
    var compressVideosFolderPath = File(
        applicationContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),
        "Compress Videos"
    )
    

关键提示:完善异常捕获

你原来只捕获了URISyntaxException,很多压缩失败的原因(比如权限不足、文件不存在、编码错误)都会抛出其他异常,补充捕获IOException和通用Exception,能快速定位具体问题。

内容的提问来源于stack exchange,提问作者net west

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:10:59