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

Android中file.exists()与file.isFile失效,无法检测下载目录已下载文件

问题原因分析
  • 路径构建错误:Environment.DIRECTORY_DOWNLOADS是系统定义的目录名常量(值为"Download"),不是完整的外部公共目录路径,你直接用它作为父路径构建File,得到的是应用私有目录下的相对路径,和你下载时用setDestinationInExternalPublicDir指向的公共Downloads目录路径完全不匹配。
  • 权限适配问题:Android 10(API 29)及以上版本对外部存储访问做了分区存储限制,就算路径正确,没有对应权限也无法读取公共目录下的文件。
  • 文件名非法字符问题:如果track.trackName包含斜杠、问号等文件系统不允许的特殊字符,下载时系统会自动转义或重命名文件,你查询时用原始名称自然匹配不到。
修复方案

1. 修正文件路径构建逻辑

查询时要和下载时的路径生成规则保持一致,用Environment.getExternalStoragePublicDirectory()获取公共Downloads目录的完整路径,代码如下:

private fun getTrack(track: Track) {
    // 这里才是和下载路径匹配的完整路径
    val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
    val file = File(downloadsDir, track.trackName + ".mp3")
    
    try {
        if (file.exists() && file.isFile) {
            Toast.makeText(this, "FILE EXISTS", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this, "FILE NOT FOUND", Toast.LENGTH_SHORT).show()
            downloadTrack(track)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

2. 补充必要的权限配置

在AndroidManifest.xml中添加对应权限:

<!-- Android 9及以下版本需要 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- Android 13及以上版本读取公共目录音频文件需要 -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

如果你的应用适配了Android 10,还可以在<application>标签下临时添加android:requestLegacyExternalStorage="true"关闭分区存储限制(该配置在Android 13及以上版本无效,仅做过渡用)。

3. 文件名合法性校验

下载前先对track.trackName做特殊字符过滤,避免系统自动重命名导致匹配失败:

// 过滤文件名中的非法字符
val safeFileName = track.trackName.replace("[\\\\/:*?\"<>|]".toRegex(), "_") + ".mp3"
// 下载和查询时都用这个safeFileName作为文件名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:54:04