如何将图像保存在android Q的子目录中同时保持向后兼容

mul*_*ter 8 image backwards-compatibility mediastore subdirectory android-10.0

我正在创建一个简单的图像编辑器应用程序,因此需要加载和保存图像文件。我希望保存的文件在单独的相册中显示在图库中。从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);
Run Code Online (Sandbox Code Playgroud)

然后,我使用insert方法返回的URI保存位图。问题在于,在API 29中引入了RELATIVE_PATH字段,因此当我在较低版本上运行代码时,图像将放入“ Pictures”文件夹,而不是“ PATH / TO / ALBUM”文件夹。

Com*_*are 5

在这种情况下可以使用不赞成使用的代码吗?还是会很快从sdk中删除这些方法?

DATA选项在Android Q上不起作用,因为query()即使您要求,该数据也不包含在结果中。

Environment.getExternalStoragePublicDirectory(...)尽管您可以添加清单条目以重新启用它,但该选项默认情况下在Android Q上不起作用。但是,该清单条目可能会在Android R中删除,因此除非您时间不多,否则我不会走这条路线。

AFAIK,MediaStore.Images.Media.insertImage(...)即使已弃用,仍然可以使用。

是否有可能以这种方式实现它,因此它向后兼容,但是不需要不推荐使用的代码?

我的猜测是,您将需要使用两种不同的存储策略,一种用于API Level 29+,另一种用于较旧的设备。我在此示例应用程序中采用了这种方法,尽管我正在处理视频内容,而不是图像,所以insertImage()不是一种选择。