【发布时间】:2019-11-23 15:20:57
【问题描述】:
我正在创建一个简单的图像编辑器应用程序,因此需要加载和保存图像文件。我希望保存的文件出现在画廊中的单独相册中。从 Android API 28 到 29,应用程序能够访问存储的程度发生了巨大变化。我可以在 Android Q (API 29) 中做我想做的事,但这种方式不向后兼容。
当我想在较低的 API 版本中获得相同的结果时,到目前为止,我只找到了需要使用已弃用代码的方法(从 API 29 开始)。
这些包括:
-
MediaStore.Images.Media.DATA列的使用 - 通过
Environment.getExternalStoragePublicDirectory(...)获取外部存储的文件路径 - 直接通过
MediaStore.Images.Media.insertImage(...)插入图片
我的问题是:是否有可能以这种方式实现它,因此它向后兼容,但不需要弃用代码?如果不是,在这种情况下可以使用已弃用的代码,还是这些方法很快会从 sdk 中删除?无论如何,使用不推荐使用的方法感觉很糟糕,所以我宁愿不这样做:)
这是我发现的适用于 API 29 的方式:
ContentValues values = new ContentValues();
String filename = System.currentTimeMillis() + ".jpg";
values.put(MediaStore.Images.Media.TITLE, filename);
values.put(MediaStore.Images.Media.DISPLAY_NAME, filename);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.RELATIVE_PATH, "PATH/TO/ALBUM");
getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
然后我使用 insert 方法返回的 URI 来保存位图。问题是 API 29 中引入了 RELATIVE_PATH 字段,因此当我在较低版本上运行代码时,图像被放入“图片”文件夹而不是“PATH/TO/ALBUM”文件夹中。
【问题讨论】:
-
我的猜测是您将需要使用两种不同的存储策略,一种用于 API Level 29+,另一种用于旧设备。 “在这种情况下可以使用不推荐使用的代码吗” - 是的。像这样的东西“弃用”意味着“我们希望你使用其他东西”。如果您在较新的 Android 版本上使用这些“其他东西”,则在较旧的 Android 版本上运行的代码可以毫无问题地使用已弃用的 API。很少会从 SDK 中删除类和方法,这样您的代码将不再构建,我不希望您的任何选项都会发生这种情况。
-
@CommonsWare 感谢您的想法,这正是我现在正在做的事情,我想这是唯一可行的方法。如果您愿意,可以将您的评论转换为答案,我会接受。
-
@multimodcrafter 你是如何让图像保存工作的?
insert方法的 uri 基本上类似于content://media/external/images/media/123我无法从中获取文件路径。你介意发布代码吗?谢谢, -
其实我只是想通了。感谢@multimodcrafter,如果没有你的帖子,我将无法在 Android Q 中将图片保存到图库中。
-
@DavidSantiagoTuriño 不错。我使用
contentResolver.openOutputStream(uri)直接基于uri 创建了一个流,我猜在引擎盖下它与您的方法相同。我的代码记录在这里:stackoverflow.com/questions/36624756/…
标签: image subdirectory backwards-compatibility mediastore android-10.0