Android Q 适配

最近(大概4月中旬)收到华为市场官方的邮件,要求APP端能在五月底之前适配完最新的Android Q系统.在这个时间段内穿插了两个项目需求版本,Android Q的版本也从Bate1升级到了Bate3.
Android Q版本的更新还是相当大的,在Bate1版本如果未适配.即使在targetSdkVersion不是Q的情况下,可能应用程序依然不能正常运行.可能是考虑这个操作过于激进,最新的Bate3版本把外部存储沙箱化的过程,继续往后延迟一个版本Android至11.大概就是要留出一个版本时间让大家进行适配.
在浏览华为官方给出的适配指导文档以及Android官方的Android Q版本介绍后,大概有一下几个比较重要的改动:

存储权限(外部存储的沙箱化与iOS一样的体验)

在Bate1版本中,Google官方文档说明,沙盒化是必然在Q版本生效的
可以使用adb shell sm set-isolated-storage on打开系统的全局沙箱化,并表示在后续的版本中会逐渐默认开启.对于从低版本升级到Q的系统,如果APP的目标平台低于Q,则默认不会沙箱化该APP,但是一旦重装就会受到这个约束.
不过在Bate3中又做了改动,沙箱化的改动不再是全局直接生效,而是针对每个APP的在清单文件中,通过<application android:allowExternalStorageSandbox = “false” ... >这个字段配置生效,其中如果TargetSDKVersion是Q的话,那么这个值默认是true.(在官方文档中表示这个"allowExternalStorageSandbox"关键字只是暂定的,可能后续会改动).
针对没有外部存储的设备,如果想要做测试的话,可以使用adb shell sm set-virtual-disk true指令设置虚拟磁盘测试.
沙箱化生效后,针对APP访问外部存储就大致分了三个部分.

外部存储访问.png

1.访问自己沙箱内的文件
无需任何权限.自己沙箱的目录地址是Context.getExternalFilesDir(),如果想要保存一张图片,那么他的地址目录,应该是:Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).
其中访问自己沙箱内的文件,依然可以使用Java的File系统.直接使用路径名.但是如果不是自己沙箱内的文件,返回的文件路径将不能直接使用.
2.访问外部的公共多媒体文件
Bate1版本中,Google新增了三个权限READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO表示访问media的权限,取代了之前的READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE.兼容的话,老版本后者的权限会在Q平台默认转换成前三个新权限.针对后三个新权限,其中读取Images和Video是一体的,申请一个通过,那么另一个也白给.
对于多媒体文件,一个APP只能写入或者删除自己插入的文件,其他APP插入的,不能修改.除非APP本身是系统默认应用.比如APP是默认图库,那么他可以删除或者修改其他APP插入的图片.如果有修改其他APP多媒体文件的需求,要有限申请默认的角色权限.
不过在Bate3版本,google又退回了原来的权限.整体上就是使用MediaStore的API做多媒体文件的访问.
3.访问外部的下载文件
Google在4.4版本就已经 有一套Storage Access Framework(SAF) 的 DocumentFile API 进行读写.通过这种形式还可以持续获得某个文件夹的读取权限.
google说明使用SAF的API可以读取上边三种存储,而不需要任何权限.
4.访问其他APP的沙箱文件
类似于分享功能,如果我们需要分享一张自己的沙箱内的图片,到微信或者其他平台.那么因为沙箱的问题,会造成该文件无法找到.这个解决方案类似于Android7.0上的FileUriExposedException,需要使用V4包提供的FileProvider,将file的传递转换为content的传递,然后同时赋予暂时的读权限.分享的功能,我们使用的是SDK,据观察微信的分享SDK用的就是FileProvider的形式.

以上就是Android Q关于外部存储的改动,还有诸多细节以及新的特性没有一一列出,毕竟我们主要是想APP的正常运行,这部分对于我们APP的影响,需要检查的位置主要有:
1.分享 2.修改头像时图片选择 3.上传评价时图片的选择 4.将海报存储到本地相册.

设备唯一标识符

AndroidQ中去掉了READ_PHONE_STATE权限,取而代之的是一个系统级别的权限:READ_PRIVILEGED_PHONE_STATE,所以Android Q平台无论如何也不会再有IMEI和序列号SerialNumber
1.对于目标平台<Q并且没有申请READ_PHONE_STATE权限,或者目标平台>=Q,尝试获取DeviceId或抛出SecurityException.
2.对于目标平台<Q并且申请READ_PHONE_STATE权限,那么读取deviceId(IMEI)为null.
3.通过Build.getSerial()获取到的值会是unknown.
针对这个变化,需要重新整理APP内生成设备唯一Id的方法:Google官方的指导方法,不过这个方法可能同一设备不唯一.ANDROID_ID的获取一直不受影响. 不过这个值可能因为手机厂商的设置导致不可用.不过设备唯一Id一直也没有100%的解决方案,可以根据实际情况定夺.

后台定位权限

Android Q中新增了后台定位权限ACCESS_BACKGROUND_LOCATION,之前的ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION则表示用户请求前台定位权限.那么Android的定位权限对话框就表现的iOS一致.

Android Q定位权限对话框.png

其中对于老版本,申请了ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION后,系统会默认帮你申请ACCESS_BACKGROUND_LOCATION,即对话框所示.
PS:如果用户拒绝了后台定位,那么就只能通过启动前台服务来进行前台定位.而且前台服务目标需要设置为locaiton.foregroundServiceType=“location”事实上,根据适配指导,Android Q的后台定位会有比较大的限制,大概30m一次,如果是导航,启动前台服务依然是必须的.
PPS:AndroidQ这里对于应用前台的定义就是有没有可见的Activity或者前台service.这一点与Android O中,后台启动服务的后台又有不一样.具体可以参考Android 8.0后台启动服务.
我们的APP其实对于定位不需要做任何改动.因为不需要后台定位权限.

禁止应用后台弹页面

AndroidQ在开发者选项中:关闭允许系统执行后台活动开发者选项即可启用限制.只能通过用户的交互来打开活动,对应的解决方法是开启一个全屏的通知.
这个一般针对电话,闹钟此类应用.

Android Q非SDK接口限制

与Android P 类似,具体的分析方法,可以参考官方的工具.
我们APP使用较少,主要是三方SDK的使用.

[参考文档]
https://juejin.im/post/5cad5b7ce51d456e5a0728b0#heading-10
https://developer.android.google.cn/preview/privacy/checklist
https://feng.moe/archives/47/?replyTo=23

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341