Android 11 URI 使用情况(文件 ://content://)

标签 android android-permissions android-fileprovider android-11

我们有一些类似词语的老问题,但大多数都是关于转换其中之一。

我在这里看到的是新更改后 URI 使用的“正确”行为。让我提供一些背景信息:

之前,当我们获取图像 URI 时,将返回 file://...格式。 但是由于新的操作系统权限发生了变化,我们不应该在哪里使用WRITE_EXTERNAL_STORAGE我们不再应该使用 getUriForFile(..)返回 content://...路径。(范围存储使用 Android 11 Storage FAQ )

这可以在一些 Android 指南上找到,例如:taken photos guide

“问题”是许多用户习惯使用裁剪图像的 URI(例如)来创建它的文件并保存它。

现在,随着这些变化出现了问题:

我们应该如何使用 URI?

  1. 编写一些代码来检查 Android 版本,如果超过 29,我们应该为 URI 创建一个新文件路径?
  2. 让 URI 成为图像的路径(contentfile ),如果有人想要保存它,则需要创建自己的文件路径
  3. 关于如何正确使用 URI,我还有一些不明白的事情。

Obs:问这个问题是因为 Android Image Crop 开源项目移交,我们需要升级 Android 10/11 的权限,但现在我们遇到了这个内容/文件问题。 More here

编辑: 正如评论所指出的

代码返回file:// (自更改后不再有效)

Uri outputFileUri = null;
outputFileUri = Uri.fromFile(
                  new File(context.getExternalCacheDir().getPath(), 
                  "pickImageResult.jpeg")
                );
    

代码返回content://

outputFileUri = FileProvider.getUriForFile(
                        context,
                        context.getPackageName() + CommonValues.authority,
                        File.createTempFile("pickImageResult", ".jpeg", getImage)
                );

最佳答案

The "problem" is that many users got used to use the URI of a crop image (for example) to create a file of it and save it.

最后,这是您的库,您需要记录任何 Uri 的内容。您返回的适合。毕竟,一个Uri可以指向:

  • 文件系统上的文件 ( file )
  • 网络资源( https ,或者可能 http )
  • Android 资源 ( android.resource )
  • 应用中的 Assets ( file://android_asset )
  • 某些任意字节集 ( content )

您的库用于图像裁剪。虽然我还没有检查其实现,但我认为这一切都在应用程序本身内部运行。如果是这样,返回 file 没有任何问题。 Uri ,如果你想这样做的话。您的代码正在某处写入文件(例如 getCacheDir() 上的 Context )。使用您的库的应用程序必须有权访问该文件,否则您在尝试写入它时会崩溃。一个Uri通过 Uri.fromFile() 创建,对于该文件来说,在该应用程序中完全没问题。

哪里Uri.fromFile()成为一个问题是通过 Uri到另一个应用程序。但是,您的库用于裁剪图像,而不是与其他应用程序共享内容。恕我直言,您的工作是将裁剪后的图像返回给应用程序。应用程序用它做什么取决于该应用程序,受到 Uri 中的任何限制。你交出的。

您似乎正在考虑的两个选项有不同的问题:

<表类=“s-表”> <标题> Uri来源 优点 缺点 <正文> Uri.fromFile() 便宜、简单 只能在应用程序本身内使用;无法传递给其他应用 FileProvider Uri可以传递给其他应用 需要库和 list 配置;无法轻松访问底层文件

由于恕我直言,图像裁剪器不是图像共享解决方案,Uri.fromFile()看起来很合理。如果使用您的库的应用程序想要转身并共享裁剪后的图像,他们会设置 FileProvider自己并使用 FileProvider.getUriForFile() 。唯一的问题是,要么您需要记录文件将写入的位置,要么给他们一个选项来告诉您要使用哪个目录 - 设置 FileProvider 需要该信息。元数据。

有一天,如果您选择更改 API,您可能会考虑返回普通的 File而不是Uri 。这样,就不会混淆它所代表的内容。

但是,最终,这都是你的决定。如果你想使用FileProvider ,或者您想将图像上传到您自己的 Web 服务器并使用 https ,这一切都取决于你。但是,您应该记录您正在做什么以及Uri代表。

关于Android 11 URI 使用情况(文件 ://content://),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66857964/

相关文章:

android - 有没有办法在不使用 gdata-java-client 的情况下访问日历条目?

Android资源编译在3.3.0-alpha02失败

android - POST_NOTIFICATIONS 权限对话框未显示

android - 从通过 FileProvider 创建的 Uri 获取文件路径

Android 共享应用程序的 apk 使用 FileProvider

android - 如何在 Android Oreo (8.1) 或更高版本中从 URI 获取文件路径

java - GSON 避免 JsonSyntaxException 返回部分映射

android - 如何以编程方式删除我自己的自定义损坏日历?

Android - 更改 READ_PHONE_STATE 权限请求消息

Android - Eclipse 设置缺少 Google API