一、概要
因为国内应用市场已经要求TargetSdkVersion=30及以上才能上架,所以需要升级版本。
主要涉及内容以下讲解。
二、开发
1.强制分区存储
有很多文章已经介绍了,参考:
https://blog.csdn.net/unreliable_narrator/article/details/127250034
https://guolin.blog.csdn.net/article/details/113954552
所以目前操作文件的方式有三种:
1.老古董:File Path
使用方式好说。
存储目录介绍一下:
如果升级了项目的TargetSdkVersion=30及以上,那么就不可以使用Enviroment.getExternalStorageDirectory()
了
- 如果是APP升级到该版本,那么路径还在,但是访问会提示权限不够
- 如果是新安装该版本的APP,那么当你使用该目录作为根目录创建文件夹时,就会失败
所以此时想仍旧使用File Path的方式来保存文件,有两种方法:
-
使用
Enviroment.getExternalStoragePublicDirectory()
,是的,多了个Public
,可以正常保存。
然后使用通知相册更新的方法即可在相册可见。
相册更新的方法有两种:
a. sendBradCast 扫描相册的Action
b. 使用MediaScannerConnection来进行更新,其本质代码也是使用MediaStore来通知更新的。 -
使用私有目录
即使用context.getExternalFilesDir
之类,也就是用上下文context
来获取应用的私有目录。
应用的私有目录:当然它的文件是位于应用包名的目录下,跟随APP卸载后即删除。这点不同于公有目录存储的文件,APP的删除与它的自动删除没有关联了。
注意的是:使用私有目录存储,使用1中的相册更新方法是无法通知相册更新的。
所以,如果为了项目快速适配TSDK=30及以上,可以考虑采用方式1。因为它需要的改动很小
当然,如果涉及到原有的文件迁移,那就需要另外写一套逻辑了。
2.MediaStore
自行搜索使用
疑问:使用该方法保存在私有目录,会自动更新在相册可见么?
3.SAF
自行搜索使用
2.软件包可见性
简而言之,要查询其他APP或者跳转其他APP的能力限制了,需要做处理之后才能正常使用。
(不处理:微信、抖音、小红书等APP无法跳转,会识别手机上未安装对应的APP)
方法有两种:
- manifest文件中添加查询声明
uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission"/>
如果上架google play的话,这个权限审核会比较严格,仅限部分应用可以通过:安全、浏览器、文件等
如果不是上述范围的应用的化,使用方法2。 - manifest文件中添加单独查询声明
<queries>
<package android:name="com.tencent.mm" /><!-- 这是微信的包名 -->
<package android:name="***" />
</queries>
需要查询、跳转哪个APP,则按照上述方法添加包名。
3.无法使用后台弹出的自定义Toast
即无法在后台时弹出通过Toast.setView
方法的提示了。
三、总结
总的来说,TSDK=30是个关键的版本。
适配重点关注:
- 使用
Enviroment.getExternalStorageDirectory()
存储的方式需要变更 - 软件包可见性需要添加声明,影响分享、跳转其他APP等功能