繁体   English   中英

java.io.FileNotFoundException:/storage/emulated/0/Download/myFile.pdf:打开失败:EACCES(权限被拒绝)

[英]java.io.FileNotFoundException: /storage/emulated/0/Download/myFile.pdf: open failed: EACCES (Permission denied)

自 Android Q 推出以来,有关从外部存储读取的权限发生了一些隐私更改。 我有一个聊天应用程序,用户可以从下载等中选择一张照片......并发送它。 所以我需要访问这些文件。 我这样做的方法是使用 contentProvider。

context.contentResolver.openInputStream(uri)?.use { inputStream ->
    while (true) {
       numBytesRead = inputStream.read(buffer)
       // .. do stuff
   }
}


当时可用的uri是-> file:///storage/emulated/0/Download/myFile.pdf

但是我得到一个 FileNotFoundException 但文件确实存在。

我已经在清单中设置了所有权限,并在应用程序启动时授予它们。 从 Android <= 9 开始,它可以正常工作。 那我该怎么办……?

我有一个聊天应用程序,用户可以从下载等中选择一张照片......并发送它

这在 Android 10 及更高版本上是不可能的。 你需要切换到别的东西。 例如,您可以使用ACTION_OPEN_DOCUMENT来允许用户从用户想要的任何地方选择内容。 然后,使用生成的Uri将其上传到您的聊天服务器,类似于您在代码片段中使用Uri 或者,更好的是,不要将其全部读入内存——使用类似OkHttp InputStreamRequestBody implementation 的东西。

对于 Android 10,您可以将android:requestLegacyExternalStorage="true"到清单中的<application>元素。 这将使您选择使用旧存储模型,并且您现有的外部存储代码将起作用。 但是,这不适用于 Android R 及更高版本,因此这只是一个短期修复。

暂无
暂无

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

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