原文地址
https://mp.weixin.qq.com/s/twLXbCQHL-NPfR23yzjh4g
这里主要是涉及存储的适配,问题有个向下兼容跟向上兼容,还有他们从低版本升级到高版本后数据迁移。
兼容问题
『解决办法,进行了版本区分,对外暴露OutputStream接口,低版本我们采用直接路径的方式,直接把视频保存到Movies目录下,而且还可以有子目录,为了让相册或者别的app能看到保存的视频,我们通过DATA把保存路径注册给了MediaStore,这个在低版本上是可行的,这种方式绝大多数开发者之前都是这么做的,但是,DATA从Android 10开始标记为弃用。
我们这里会问,我们可不可以在Android 10及以上也用直接路径保存视频到Movies目录下呢?可以,但是会有问题,首先Android 10的分区存储模型下不能使用直接路径,因为使用File api报错,不过我们可以通过requestLegacyExternalStorage禁用分区存储模型;最大的问题是获取Movies目录的接口getExternalStoragePublicDirectory从Android 10开始标记为弃用。而且google还提示了使用直接路径操作媒体文件的性能问题。』
数据迁移问题
『得分几种情况讨论:
targetSdkVersion 28的app安装在Android 9(28)的手机上,手机系统升级到Android10或11,app正常访问旧存储模型。这种情况和把targetSDKVersion 28的app安装到Android10或11系统手机上一样的情况。
target 28在Android 9上,app target升级到30,覆盖安装,旧存储模型访问正常;target 28在Android10上,app target升级到30,覆盖安装,旧存储模型访问正常。
requestLegacyExternalStorage设置成true,在Android 10上新安装的target 30 app,也可以正常访问旧存储模型。
target28在Android11上,app target升级到30,覆盖安装,旧存储模型不能访问了,需要preserveLegacyExternalStorage设置成true』