android kotlin java.io.FileNotFoundException:/storage/emulated/0/number.txt:打开失败:EACCES(权限被拒绝)

android kotlin java.io.FileNotFoundException: /storage/emulated/0/number.txt: open failed: EACCES (Permission denied)

我正在使用 kotlin 为 Android 10 编写应用程序。 该应用程序必须从内部存储中读取名为 number.txt 的文件。

但总是失败:

java.io.FileNotFoundException: /storage/emulated/0/number.txt: open failed: EACCES (Permission denied)

这是我清单中的内容:

...
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...

我只需要读取文件,所以清单中没有写权限。

这是我的代码,如您所见,我使用了运行时权限:

这是请求权限的函数,如果获得许可,则读取文件:

    private fun setupPermissions() {
        val permission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        if (permission == PackageManager.PERMISSION_GRANTED) {
            val path = "/storage/emulated/0"
            val file = File("$path/number.txt")
            val pln = file.readText()
            plnText.text = pln
        }
        else{
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 101)
        }
    }

然后我在 onCreate 方法中调用 setupPermissions

就是这样,我不明白为什么它不起作用。

谢谢。

编辑

我不知道是什么原因,但我只是将代码更改为:

if (permission == PackageManager.PERMISSION_GRANTED) {
    val file = File("/storage/emulated/0/number.txt")
    val pln = file.readText()
    Log.i("IKO_APP", pln)
//  plnText.text = path.toString()
}

而且运行没有任何错误!我想知道为什么?

对于 Android 10,您可以将 android:requestLegacyExternalStorage="true" 添加到清单中的 <application> 元素。这会让您选择使用旧存储模型,并且您的外部存储代码应该可以工作。

并且对于读取操作,即使在将 targetSdkVersion 提高到30 或更高。

但是,对于 write 操作,您必须在 2021 年下半年之前切换到其他操作:

  • 使用 Context 上的方法,例如 getExternalFilesDir(),获取您的应用可以写入的外部存储目录。在 Android 4.4+ 上使用这些目录不需要任何权限。但是,当您卸载应用程序时,您存储在那里的数据将被删除。

  • 使用存储访问框架,例如ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT

  • 如果您的内容是媒体,您可以使用 MediaStore 将媒体放置在标准媒体位置。