当前位置: 首页 > 知识库问答 >
问题:

访问权限拒绝外部文件在Android 10

梁丘缪文
2023-03-14

我的应用程序的目标SdkVersion=29

我拍了一张照片,它保存在路径:

src=/storage/simulated/0/DCIM/Camera/IMG_20201120_091943。jpg

然后我想使用FileInputStream/FileOutputStream将此图像复制到内部存储。虽然,我的应用程序有WRITE/READ存储权限,但当我编码

InputStream inputStream = FileInputStream(src)

我收到了一个FileNotFoundExc0019(打开失败:拒绝EACCES权限)。

有人有同样的问题吗?

注意:我不想通过使用AndroidManifest选项来解决这个问题。xml,因为它是临时的

Android:请求LegacyExtranalstore="true"

共有3个答案

闻修筠
2023-03-14

在Android 10上,您不能使用文件API访问共享存储中的文件,不幸的是,Android文档对此并不一致,您可以在这里找到它

要解决这个问题,请在Android10上使用Uri API,尽管这在Android11中不是问题

val uri = ContentUris.withAppendedId(MediaStore.Image.Media.EXTERNAL_CONTENT_URI, id)

applicationContext.contentResolver.openInputStream(uri).use { stream ->
   // do your thing here
}

注意:您仍然可以在应用程序拥有的任何文件上使用文件API

别兴国
2023-03-14

我显示详细我的代码使用FileInputStream/FileOutputStream

src=/storage/simulated/0/DCIM/Camera/IMG_20201120_091943。jpg

dst=/storage/simulated/0/Android/data/my_app/files/Pictures/IMG_20201118_113434。jpg

src是保存照片的地方,dst是我想将文件src复制到此文件的地方

public void copy(String src, String dst) {
        try {
            BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(src));
            OutputStream outPutStream = new FileOutputStream(dst);
            int len;
            byte[] buf = new byte[1024];
            while ((len = bufferedInputStream.read(buf)) > 0) {
                outPutStream.write(buf, 0, len);
            }

            outPutStream.flush();
            outPutStream.close();
            bufferedInputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

第行的FileNotFoundException(打开失败:EACCES权限被拒绝):

BufferedInputStream BufferedInputStream=新的BufferedInputStream(新文件输入流(src));

徐飞龙
2023-03-14

当您的targetSdkVersion

所以简而言之,你不能真的这样做。如果目标SdkVersion为29,则应使用MediaStore API编写共享存储(/存储/仿真/0/DCIM/Camera/IMG_20201120_091943.jpg不是应用的私有空间,因此规则适用)

以下是如何使用MediaStoreApi将您的图像插入到用户的图像中:https://stackoverflow.com/a/56990305/5601663

此外,如果你真的只是想保存文件,以便它只在你的应用程序中可用,那么你不需要使用MediaStoreApi,请参阅这篇关于如何在你的应用程序私有目录中保存的文章:https://medium.com/@maksymilian.wojcik/android-saving-files-in-internal-storage-image-from-byte-array-etc-dd7d1b86d309

编辑:您当然可以在清单上使用requestLegacyExternalStorage标志,但您已经说过不想使用该标志

Edit2:我现在明白了,你想从共享存储读取数据。这也行不通,因为如果您的targetSdkVersion

 类似资料:
  • 问题内容: 因此,我只是试图创建一个通过gmail进行导航并自动执行某些任务的代码。我设法成功自动登录到GMail,但是尝试登录页面源时登录后仍然遇到此错误代码。 错误代码 Java代码 注意:我使用的是最新版的Firefox和最新版的Selenium PS:关于类似问题,我经历了11个以上的不同问题,没有人提供明确的解决方案,答案也非常模糊。 问题答案: 伙计们,我很久以前就找到了解决此问题的方

  • 新并行/分布式计算和有问题的客户端服务器程序,我试图写。应该发生的是,服务器从客户端接收一个整数,并将总和发送回所有通向它的数字(例如,用户输入5,服务器计算1 2 3 4 5,服务器发送回15)。我还在试图弄清楚,所以我在客户端对输入进行了硬编码。 这就是我在服务器端所拥有的: 在客户端: 我也在客户端实现了接口。 我在客户端遇到的错误是: 异常线程"main"java.security.Acc

  • 我正在创建一个FileManager应用程序,我正在创建复制和剪切功能,它在内部设备存储中运行良好,但当我尝试在外部存储中复制某些内容时,它会说权限被拒绝。我拥有所有授予的写入权限。 如何在外部存储器中写入?

  • 问题内容: 我在FoxPro 6.0命令窗口中使用SQL命令,并遇到“文件访问被拒绝”。 我的SQL命令是: 情况: Windows 7专业版 FoxPro 6.0 main.dbf被共享给许多用户。 main.dbf不是 隐藏的 ,也不是 只写 任何意见将不胜感激! 问题答案: 此DBF文件位于共享驱动器上吗?如果是这样,则另一个用户可能使文件打开了“排他”,或者您正试图打开文件“排他”。默认状

  • 我很难理解为什么在从tar文件中提取文件后无法打开它们。当我试图打开或读取刚刚从tar中提取的文件内容时,我会收到一条“访问被拒绝”错误消息。我正要在StackOverflow上发布这个问题,这时我终于发现我做错了什么。我想我会把这个问题和答案张贴给将来需要它的人。简单的解决方案是只使用Perl Tar以外的东西,但是。。。 ~~~问题~ ~~ 提取tar文件的内容。如果您在尝试打开或读取刚刚从t