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