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

