我们有一些类似词语的老问题,但大多数都是关于转换其中之一。
我在这里看到的是新更改后 URI 使用的“正确”行为。让我提供一些背景信息:
之前,当我们获取图像 URI 时,将返回 file://...
格式。
但是由于新的操作系统权限发生了变化,我们不应该在哪里使用WRITE_EXTERNAL_STORAGE
我们不再应该使用 getUriForFile(..)
返回 content://...
路径。(范围存储使用 Android 11 Storage FAQ )
这可以在一些 Android 指南上找到,例如:taken photos guide
“问题”是许多用户习惯使用裁剪图像的 URI(例如)来创建它的文件并保存它。
现在,随着这些变化出现了问题:
我们应该如何使用 URI?
- 编写一些代码来检查 Android 版本,如果超过 29,我们应该为 URI 创建一个新文件路径?
- 让 URI 成为图像的路径(
content
的file
),如果有人想要保存它,则需要创建自己的文件路径 - 关于如何正确使用 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
中的任何限制。你交出的。
您似乎正在考虑的两个选项有不同的问题:
Uri
来源Uri.fromFile()
FileProvider
Uri
可以传递给其他应用由于恕我直言,图像裁剪器不是图像共享解决方案,Uri.fromFile()
看起来很合理。如果使用您的库的应用程序想要转身并共享裁剪后的图像,他们会设置 FileProvider
自己并使用 FileProvider.getUriForFile()
。唯一的问题是,要么您需要记录文件将写入的位置,要么给他们一个选项来告诉您要使用哪个目录 - 设置 FileProvider
需要该信息。元数据。
有一天,如果您选择更改 API,您可能会考虑返回普通的 File
而不是Uri
。这样,就不会混淆它所代表的内容。
但是,最终,这都是你的决定。如果你想使用FileProvider
,或者您想将图像上传到您自己的 Web 服务器并使用 https
,这一切都取决于你。但是,您应该记录您正在做什么以及Uri
代表。
关于Android 11 URI 使用情况(文件 ://content://),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66857964/