如何解决访问文件 Android 11 时权限被拒绝
我正在访问 android 中的文本文件,但显示权限被拒绝 errno13 并且我已经授予了所有存储权限
应用权限代码
解决方法
来自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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。