Android Q变更汇总

新版本时间线

Android Q 的正式版本将照例于今年第三季度发布,在此之前,Google 总共会推送 6 个 Beta 版本用于收集测试反馈,国内机型预计最早会在华为Mate30上使用。

Android Q版本变更列表

应用存储空间限制-特性介绍

1.Android Q为每个应用程序在外部存储设备提供了一个独立的存储沙箱,应用通过路径创建的文件都保存在应用的沙箱目录
2.共享集合:如果应用的一些文件是用户选择下载保存的,应用卸载的时候用户不希望删除,这部分文件开发者可以通过MediaProvider接口保存在公共共享集合,包括:照片、视频、音乐和下载集合

  1. 新的访问多媒体文件的权限:应用读写自己创建的文件不需要权限,但是如果需要读取其他应用创建的多媒体文件就需要申请对应的权限,通过MediaProvider接口读取
  2. 读写其他应用的下载公共集合文件需要使用SAF的方式读写
  3. 目前版本该特性没有默认开启,需要开发者通过命令开启:adb shell smset-isolated-storage on
  4. 参考谷歌提供的官方适配指导文档:https://developer.android.google.cn/preview/privacy/scoped-storage

应用存储空间限制-兼容性影响分析

问题 1 : 文件分享,比如应用通过微信、qq、微博等方式分享图片,分享失败
问题 2 :应用使用其他应用打开文件,比如qq调用wps打开好友发的pdf文件

问题分析:

  • 分享方应用使用file:// URI分享应用沙箱文件,由于沙箱化变更,应用无法通过文件路径直接访问应用沙箱外的任何文件,会导致接收文件方应用微博、qq和微信应用端报“文件找不到”的问题
  • 接收方应用不支持FileProvider的content uri方式,打开文件失败

适配指导:

问题 3 :读写应用沙箱外文件场景,比如:文件管理器、手机管家空间清理、微信给好友发送本地文件

问题 4 :通过SAF的方式修改头像失败,比如头条、滴滴出行等等

问题分析:

  • 应用只能在沙箱内随意读写文件,无法通过路径读写应用沙箱外文件(包括公共文件),所以可以看到es文件管理器只能看到自己沙箱的文件和目录;

  • 测试也发现一些应用通过SAF的方式修改用户头像会出现文件找不到的问题,该问题和开发者使用SAF的方式有关系,需要开发者排查,应用可以通过DocumentUI拿到文件的Content Uri,通过context.getContentResolver().openFileDescriptor(url, “r”)就可以读写文件

适配指导:

问题 5 :读写本地多媒体文件,比如微信、qq给好友发送本地图片和视频;发图片微博等等

问题 6 :图片保存的路径问题,应用直接通过路径保存文件都是保存在应用的沙箱路径,无法保存到系统相机的拍照目录DCIM

问题 7 :多媒体文件删除问题,比如三方图库照片无法删除

问题分析

  • P版本通过MediaProvider查询图片的“_data”字段值为图片的真实文件路径,应用也可以直接路径读取文件,或者通过路径判断图片文件是否存在;
  • P版本通过路径直接访问多媒体文件,包括读和写其他应用生成的文件;
  • Q版本通过MediaProvider查询图片的“_data”字段值只有图片是应用沙箱内的图片,返回的才是文件的真实路径,其他图片返回的是非文件真实路径, 通过该路径判断文件是否存在会出现问题
  • Q版本无法通过路径读写应用沙箱外的所有文件,需要读写沙箱外的多媒体文件,需要使用MediaProvider接口

适配指导:

  • 不要通过路径进行文件操作
  • 如果需要读取其他应用生成的多媒体文件,需要申请对应的权限
  • 查询图片建议使用MediaProvider查询,需要注意的是查询的“_data”值不 能再认为是文件的真实路径
  • 保存图片到沙箱外的公共文件,需要使用SAF或者MediaProvider的接口

问题 8 :新安装应用卸载,应用数据清空问题

问题分析:

  • 通过测试发现应用在sd卡根目录创建应用自己的目录保存用户的文件的做法是很普遍的;

  • P版本应用在sd卡根目录保存的应用数据卸载时不会被清楚,但是Q版本这部分数据实际保存的是应用的沙箱目录下,卸载的时候回全部被清除;

适配指导:

  • 应用不想卸载删除的文件通过SAF或者是MediaProvider的接口保存在公共目录,不要放在应用的沙箱目录,公共目录文件卸载删除默认会弹框提示,对应右边弹框的第一个勾选,默认保留,勾选删除, 谷歌后续的版本计划把这个勾选去掉,意味着应用保存到公共集合目录的文件卸载 的时候不会提示用户删除 ;

  • 对于应用的沙箱文件,应用如果不想卸载的时候被删除,需要应用在manifest文件增加:,这样卸载应用的时候,系统弹出的对话框中才会有第二个勾选框出现(不增加该属性是不会有第二个勾选出现),默认删除,勾选保留。

问题 9 :Hota升级不受沙箱影响的应用卸载残留数据,重新安装之后没有权限读写的问题。

问题分析

  • hota升级到Q版本之前已经安装的应用,并且用户授权应用存储权限,升级到Q版本将豁免沙箱影响,沙箱特性不生效;

  • 应用卸载重新安装之后,会受沙箱特性影响,所以卸载之后保留的用户的文件应用没有权限再通过路径读取,必须要通过SAF或者MediaProvider的方法读取;

适配指导:

  • 应用需要考虑历史数据迁移,希望重新安装找回来的文件通过谷歌的SAF或者MediaProvider的接口迁移到公共目录;

问题 10 :存储权限变更问题。

1.因为对于TargetSdkVersion < Q的应用,谷歌提供了兼容方案,所以不适配也不会有权限问题。

2.TargetSdkVersion>=Q的应用,需要适配增加新的存储权限申请,否则会报权限问题:

<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />  

禁止应用读取设备标识符信息

特性介绍

禁止获取device id:

  • 新权限:READPRIVILEGEDPHONE_STATE(需要系统签名才能申请)
  • 老权限:READPHONESTATE Mac地址随机化:
  • P版本没有默认开启,需要通过开发者选项手动开启
  • Q版本默认开启

兼容性影响

  • TargetSdkVersion < Q并且没有申请READPHONESTATE,或者TargetSdkVersion >=Q,获取device id会抛异常SecurityException
  • TargetSdkVersionPHONESTATE,通过getDeviceId接口读取的值为Null
  • 通过Build和Build.getSerial()返回的值为“Unknown”
  • 90%+的应用都有影响,影响很大,金融类的应用重点测试 3.适配建议
  • 指导链接:https://developer.android.com/training/articles/user-data-ids
  • 其他可替代方案:通过Android ID替代device id String ANDROIDID = Settings.System.getString(getContentResolver(),Settings.Secure.ANDROIDID);

禁止应用后台弹页面

1.特性介绍
  • 目前版本只是弹toast提示开发者需要整改的页面,未开启禁止功能,需要开发者自查和整改,后面的版本会真的禁止
  • Beta1版本功能使能方法:系统设置->开发者选项->允许系统执行后台活动
2.影响场景
  • 闹钟
  • 音乐锁屏
  • 语音电话、视频电话
3.适配指导

后台地理权限

1.特性介绍

• Q之前只有ACCESSFINELOCATION和ACCESSCOARSELOCATION

• Q版本ACCESSFINELOCATION和ACCESSCOARSELOCATION只代表仅前台位置使用权限,另外新增了ACCESSBACKGROUNDLOCATION权限,代表始终位置使用权限,如果需要始终使用位置信息,需要申请这个权限

  • 应用的TargetSdkVersionBACKGROUNDLOCATION权限,但是用户可以拒绝,可以选择仅前台使用
  • 前台定义:应用有可见的Activity或者前台服务
  • 如果用户选择仅前台使用允许,应用的页面退后台,通过启动前台服务让应用处于前台状态,必须把前台服务标为:foregroundServiceType=“location”,才能获取位置信息。
2.影响场景
  • 地图类应用的后台导航功能需要测试和适配
3.适配指导
  • 谷歌提供的适配指导:https://developer.android.google.cn/preview/privacy/device-location
  • 如果应用需要后台导航:因为O版本的“后台位置限制”管控,建议地图类的应用还是通过前台服务让应用处于前台状态,不受“后台位置限制”管控,并且前台服务增加foregroundServiceType=“location”,不受Q版本前台服务位置限制;
  • 如果应用需要在后台定期获取地理讯息:检测若没得到“始终允许”,先向用户提示说明权限的出发点,让用户主动选择“始终允许”。另外前台服务不需加上foregroundServiceType的属性。但是可能的问题就是应用切后台会受到“后台位置限制”,只能 30 分钟访问一次位置信息,所以如果有这种定期检查位置信息的需求建议采用这个方式;
  • 如果您的应用不需要后台定位,最佳做法是升级sdkversion到Q,并且不要申请后台定位权限

1.地图后台导航场景适配指导

• 可以不用申请后台定位权限:ACCESSBACKGROUNDLOCATION

• 需要启动前台服务,并且要新增设置前台服务的

foregroundServiceType,有两种设置方法:
一种是通过Manifest文件静态设置;

• 启动前台服务之前先判断是否有前台定位的权限:

2 .定期后台定位场景适配指导

• 需要申请后台定位权限:ACCESSBACKGROUNDLOCATION

另外一种是代码动态设置:

Service.startForeground(Notification notif, intserviceTypes);

• 做好权限是否授予校验:检查用户有没有主动授予应用后 台定位的权限,如果没有授予,说明原因,让用户主动授予,具体代码可参考:

启用和禁用Wi-Fi的限制

1.特性介绍
  • 在Android Q上运行的应用无法启用或停用Wi-Fi。WifiManager.setWifiEnabled()方法始终返回false。

  • 如果需要,请使用设置面板提示用户启用和禁用Wi-Fi。

2.影响场景
  • 应用的Wifi自动启动和禁用功能
3.适配指导
Intent panelIntent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);  
startActivityForResult(panelIntent, 100 );  

录音变更(并发录音、三方录音source管控)

1.特性介绍
  • P版本录音焦点不可被抢占,Q版本录音焦点可以被抢占
  • 敏感源取决于应用下发的source:AUDIOSOURCECAMCORDER和AUDIOSOURCEVOICE_COMMUNICATION

  • 抢占规则:只是限制不敏感音源无法抢占敏感音源,其他情况都可以随意抢占

2.影响场景
  • 三方应用录音焦点被抢占录音数据为空。
  • 应用的录音功能需要重点测试

3.录音变更适配指导

通过下面三个方式注册回调监听:
AudioRecoder.registerAudioRecordingCallback(Executor executor,

AudioManager.AudioRecordingCallbackcb);

MediaRecoder.registerAudioRecordingCallback(Executor executor,

AudioManager.AudioRecordingCallbackcb);  
AudioManager.registerAudioRecordingCallback(AudioRecordingCallbackcb, Handler handler);  

系统会回调当前所有的cilent信息,只要任意一个cilent状态发生了增删改 1 、使用getClientAudioSessionId() 与AudioRecord的
getAudioSessionId进行对比,可以知道哪个cilent是应用自己的
2 、使用isClientSilenced() 可以知道是否被静音
3 、getAudioSource可以知道是否有voip、camera等录音场景,应用可以初步判断优先级

张鹏宇

继续阅读此作者的更多文章