繁体   English   中英

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 或更高之后,由于“原始路径”更改,您仍然应该能够在 Android 11+ 上执行您正在执行的操作。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM