访问文件 Android 11 时权限被拒绝

问题描述

我正在访问 android 中的文本文件,但显示权限被拒绝 errno13 并且我已经授予了所有存储权限

这是显示的 logcat 错误

This is the logcat error which showing

应用权限代码

Application permission code

解决方法

来自Chaquopy FAQ

从 API 级别 29 开始,Android 有一个 scoped storage policy 可以防止直接访问外部存储,即使您的应用具有 READ_EXTERNAL_STORAGE 权限。相反,您可以使用 system file picker,并将文件作为字节数组传递给 Python:

val REQUEST_OPEN = 0

fun myMethod() {
    startActivityForResult(
        Intent(if (Build.VERSION.SDK_INT >= 19) Intent.ACTION_OPEN_DOCUMENT
               else Intent.ACTION_GET_CONTENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            setType("*/*")
        },REQUEST_OPEN)
}

override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
    if (requestCode == REQUEST_OPEN && resultCode == RESULT_OK) {
        val uri = data!!.data!!
        // For Java,see https://stackoverflow.com/a/10297073
        val content = contentResolver.openInputStream(uri)!!.use { it.readBytes() }
        myPythonModule.callAttr("process",content)
    }
}

Python 函数然后可以随意访问文件内容:

def process(content):
    # `content` is already a bytes-like object,but if you need a standard bytes object:
    content = bytes(content)

    # If you need a file-like object:
    import io
    content_file = io.BytesIO(content)

    # If you need a filename (less efficient):
    import tempfile
    with tempfile.NamedTemporaryFile() as temp_file:
        temp_file.write(content)
        filename = temp_file.name  # Valid only inside the `with` block.
,

除了获得这些权限(READ_EXTERNAL_STORAGE、 WRITE_EXTERNAL_STORAGE)在程序的初始运行过程中,必须在AndroidManifest.xml文件的标签中添加如下代码。

  android: requestLegacyExternalStorage = "true"