我正在使用 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)
}
}
然后我打电话setupPermissions
in my onCreate
method.
就是这样,我不明白为什么它不起作用。
Thanks.
EDIT
我不知道是什么原因,但我只是将代码更改为:
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 或更高。
然而,对于write操作,您必须在 2021 年下半年之前切换到其他操作:
-
使用方法Context
, 例如getExternalFilesDir()
,获取应用程序可以写入的外部存储上的目录。在 Android 4.4+ 上,您不需要任何权限即可使用这些目录。但是,当您的应用程序被卸载时,您存储在其中的数据将被删除。
-
使用存储访问框架,例如ACTION_OPEN_DOCUMENT
and ACTION_CREATE_DOCUMENT
.
-
如果您的内容是媒体,您可以使用MediaStore
将媒体放置在标准媒体位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)