微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 11 无法从本地存储读取非媒体文件

如何解决Android 11 无法从本地存储读取非媒体文件

我在 Android 11 中遇到文件选择器问题。图像或视频等文件可读,但文档等不可读。 我仔细检查了存储读取权限。

示例

uri = content://com.android.providers.downloads.documents/document/103 
someFile = /storage/emulated/0/Download/IMG_20210310_232019_1.jpg
someFile.canRead -> true

但是

uri = content://com.android.providers.downloads.documents/document/msf:1390 
someFile = /storage/emulated/0/Download/file-example_PDF_1MB.pdf
someFile.canRead() -> false

然后:

com.amazonaws.AmazonClientException: Unable to calculate MD5 hash: /storage/emulated/0/Download/file-example_PDF_1MB.pdf: open Failed: EACCES (Permission denied)

这是我的FILE_PROVIDER_PATHS

<paths>
    <cache-path
        name="camera"
        path="camera/" />
    <external-path
        name="external_files"
        path="." />
    <root-path
        name="external_sd_files"
        path="/storage/" />
</paths>

文件选择功能

fun pickFile(fragment: Fragment) {
    val intent = Intent()
    val mimeTypes = arrayOf(
        "image/*","application/msword","text/*","application/vnd.ms-xpsdocument","application/vnd.ms-works","application/xhtml+xml","application/vnd.openxmlformats-officedocument.wordprocessingml.document",// .doc & .docx
        "application/vnd.ms-word.template.macroEnabled.12",// .dotm
        "application/vnd.openxmlformats-officedocument.wordprocessingml.template",// .dotx
        "application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation",// .ppt & .pptx
        "application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",// .xls & .xlsx
        "application/pdf"
    )
    intent.type = "*/*"
    intent.putExtra(Intent.EXTRA_MIME_TYPES,mimeTypes)
    intent.action = Intent.ACTION_GET_CONTENT
    intent.putExtra("return-data",true)
    fragment.startActivityForResult(
        intent,SELECT_FILE_REQUEST
    )
}

onActivityResult:

override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
    if (requestCode == ChatFileUtils.SELECT_FILE_REQUEST) {
        if (resultCode == RESULT_OK) {
            if (data != null) {
                pickiT.getPath(data.data,Build.VERSION.SDK_INT)
            }
        }
    }
    super.onActivityResult(requestCode,resultCode,data)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。