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

Android Studio与Kotlin中File Not Found Exception问题求助

问题分析与解决

你的代码出现找不到文件的错误,核心原因有几个:

  • 路径错误:直接写/Downloads/test.text不是Android系统中下载目录的正确绝对路径,Android的公共存储目录必须通过系统API获取。
  • 权限缺失:Android对文件存储有严格的权限管控,没有对应权限无法写入外部存储。
  • 额外问题:你的catch块没有任何异常处理逻辑,出现问题也看不到具体错误信息,根本没法排查。

修复步骤

1. 配置清单权限

在AndroidManifest.xml中添加存储权限(适配Android 9及以下版本):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
<!-- Android 10及以上如果想兼容旧存储模型,需添加下面这行 -->
<application
    ...
    android:requestLegacyExternalStorage="true">
</application>

2. 动态申请权限(Android 6.0+)

WRITE_EXTERNAL_STORAGE属于危险权限,必须在代码中动态申请:

private val REQUEST_STORAGE_PERMISSION = 1001

fun checkStoragePermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
            REQUEST_STORAGE_PERMISSION
        )
    } else {
        // 权限已获取,执行写入操作
        writeTextFile()
    }
}

// 处理权限申请结果
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == REQUEST_STORAGE_PERMISSION) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            writeTextFile()
        } else {
            Toast.makeText(this, "需要存储权限才能创建文件", Toast.LENGTH_SHORT).show()
        }
    }
}

3. 修正文件写入函数

用系统API获取正确的下载目录路径,同时完善异常处理:

fun writeTextFile() {
    try {
        // 获取系统公共下载目录
        val downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
        // 拼接文件名创建文件对象
        val file = File(downloadDir, "test.txt") // 注意后缀是txt,不是text
        // 写入文本
        file.writeText("This is a text file")
        Toast.makeText(this, "文件已成功创建在下载目录", Toast.LENGTH_SHORT).show()
    } catch (e: IOException) {
        // 打印异常信息方便排查
        e.printStackTrace()
        Toast.makeText(this, "创建文件失败:${e.message}", Toast.LENGTH_SHORT).show()
    }
}

额外提示(Android 10+)

从Android 10开始,Google推出了分区存储(Scoped Storage),上面的方法通过requestLegacyExternalStorage兼容旧模型,但如果你的应用目标SDK是30+,更推荐使用MediaStore或存储访问框架(SAF)来写入公共目录,避免依赖旧存储模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:39:57