android kotlin java.io.FileNotFoundException:/storage/emulat



我正在使用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>元素中。这将使您选择传统的存储模型,并且您的外部存储代码应该可以工作。

对于读取操作,您应该仍然能够在Android 11+上做您正在做的事情,这得益于";原始路径";更改,即使在您将targetSdkVersion提高到30或更高之后。

然而,对于写入操作,您必须在2021年下半年之前切换到其他操作:

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

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

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

最新更新