首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问文件时权限被拒绝Android 11

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

Stack Overflow用户
提问于 2021-07-06 13:29:11
回答 2查看 818关注 0票数 1

我在安卓中访问文本文件,但权限被拒绝的errno13出现,我已经给了所有的存储权限

这是显示的logcat错误

应用权限代码

EN

回答 2

Stack Overflow用户

发布于 2021-07-06 22:07:45

Chaquopy FAQ

从API level 29开始,即使你的应用程序拥有READ_EXTERNAL_STORAGE权限,安卓也会有一个scoped storage policy来阻止直接访问外部存储。相反,您可以使用system file picker,并将文件作为字节数组传递给Python:

代码语言:javascript
复制
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函数可以随心所欲地访问文件内容:

代码语言:javascript
复制
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.
票数 0
EN

Stack Overflow用户

发布于 2021-07-06 14:29:46

除了在程序的初始运行期间获得这些权限(READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE)之外,还必须将以下代码添加到标记中的AndroidManifest.xml文件中。

代码语言:javascript
复制
  android: requestLegacyExternalStorage = "true"
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68265019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档