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

Kotlin读取指定路径视频异常:文件存在却触发不存在分支求助

问题解决:文件存在却进入else分支的原因及修复

核心错误原因

你当前的判断逻辑完全错误:File类的构造函数只要传入路径参数就会返回一个File对象,永远不会为null。if (videoFile != null)这个条件永远成立,但你说代码进入else分支,本质是混淆了File对象存在和实际文件存在的区别——File对象仅代表路径引用,不代表路径对应的文件真实存在。

修复方案

1. 修正判断条件

把判断文件是否存在的逻辑从videoFile != null改成videoFile.exists() && videoFile.isFile,这样才能真正检查路径对应的文件是否真实存在且是普通文件(而非目录)。

2. 适配Android存储规范(推荐)

从Android 10开始,系统引入了Scoped Storage,直接使用Environment.getExternalStorageDirectory()会有兼容性问题,建议改用应用专属的外部存储目录,无需额外权限,路径更可靠。

修改后的完整代码

val videoFileName = "heartrate_video.mp4"
// 获取应用专属的Movies目录,适配Android 10+
val moviesDir = getExternalFilesDir(Environment.DIRECTORY_MOVIES)
val videoFile = File(moviesDir, videoFileName)

if (videoFile.exists() && videoFile.isFile) {
    val slowTask = SlowTask { heartRate ->
        showToast("Heart Rate: $heartRate bpm")
        Log.d("Heart Rate", "Heart rate: $heartRate")
    }
    slowTask.execute(videoFile.absolutePath)
} else {
    Log.e("VideoPath", "Video file does not exist or is not a valid file")
    // 打印预期路径,方便排查路径是否匹配
    Log.e("VideoPath", "Expected file path: ${videoFile.absolutePath}")
}

额外排查步骤

  • 核对路径拼写:打印videoFile.absolutePath,确认和实际文件的路径、文件名(包括大小写)完全一致。
  • 权限检查:Android 9及以下需在Manifest中声明READ_EXTERNAL_STORAGE权限,并动态申请;Android 10+使用应用专属目录无需权限,若访问其他目录需申请MANAGE_EXTERNAL_STORAGE权限。
  • 验证文件存在:通过adb命令adb shell ls <打印出的路径>,或者手机文件管理器确认文件确实存在。

内容的提问来源于stack exchange,提问作者Sarfraz Nawaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:42:24