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
相关产品推荐
相关产品推荐

