我正在使用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_DOCUMENT
和ACTION_CREATE_DOCUMENT
。 -
如果您的内容是介质,则可以使用
MediaStore
将介质放置在标准介质位置。