在AndroidQ R及以上的适配(一)-分区存储的适配中主要对AndroidQ及以上的分区存储做了简单的适配分析,针对其他的适配在简单总结下。
在Android11中,对于敏感的数据类型如位置信息、摄像头、麦克风,新增一次授权的临时访问权限,如图所示:
相对于从Android6出现的动态申请权限,APP可以临时获得一次性权限,该使用时效范围为:
所以对于APP如果不符合上述三种情况,该权限就会被收回,并且该APP的进程被杀掉。
对于该内容的适配,APP在申请权限的时候,尽量不要申请与功能不相关的权限,并且如果用户拒绝了该权限,APP应提示用户该权限的作用,并且引导用户去设置界面,对该权限进行授权。
在Android10之前通常可以通过wifiInfo.getMacAddress()可以获取到设备的MAC地址,可以作为设备唯一标示的一部分,但是从Android10之后,系统会随机分配MAC地址,同时无法访问包含与设备的网络状态相关的信息的/proc/net,但可以使用NetworkStatsMananger或ConnectivityManager类进行获取
从Android10开始,必须拥有android.permission.READ_PRIVILEGED_PHONE_STATE才可以访问设备的IMEI和序列号,而该权限只能系统APP才可以使用,所以对于普通的APP,已经无法获取到设备的IMEI和序列号。所以从Android10开始,如果在调用下面的方法将无有效内容返回:
Build.getSerial();
telephoneManager.getImei();
telephoneManager.getDeviceId();
telephoneManager.getMeid();
telephoneManager.getSImSerialNumber();
telephoneManager.getSubscriberId();
现在移动安全联盟已经与国内的支持该功能的手机厂商推出了OAID,该体系中有四种标示:
从Android11之前,只要用户同意授权READ_PHONE_STATE权限,就可以通过TelephonyManager或TelecomManager的getLine1Number()获取到电话号码,但从Android11开始,READ_PHONE_STATE权限已经不在使用,需要通过READ_PHONE_NUMBERS权限才可以获取。
需要在AndroidManifest声明权限的时候增加如下配置:
从Android10引入了ACCESS_BACKGROUND_LOCATION权限,该权限相比较与 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION ,该权限运行应用在后台运行的时候对位置信息的访问。
在Android9及以下,如果在AndroidManifest中声明ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION ,用户在授权之后,可以直接在前后台访问位置权限;
在Android10,如果仅在AndroidManifest中声明ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION,用户授权之后,仅能在前台访问位置权限;但是如果在AndroidManifest即声明ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION,又声明ACCESS_BACKGROUND_LOCATION权限,那么用户在同意授权之后,才可以在前后台进行访问位置权限;
在Android11之前,可以通过PackageManager中的getInstalledPackaged(0)或者访问Android/data/data下的内容来获取系统安装的所有APP,但从Android11开始,会限制APP去访问其他APP的信息和安装状态,如果APP一定要获取某些APP的信息,必须在AndroidManifest中声明这些APP的清单,例如:
但是第2和第3种方式会在Google Play上架应用的时候检测并限制这两种方式的使用。
从Android11开始,APP只能在前台才能使用camera和microphone。当在service组件中使用camera和microphone的时候,必须为该service组件添加foregroundServiceType为camera和microphone,如:
从Android10开始,系统会增加针对Activity后台启动的限制,即APP处于后台的时候打开Activity。这样可以减少用户行为的中断,让用户更好的控制屏幕中的内容。影响范围是非用户通过直观操作的打开的Activity。所谓的前台应用就是下面几种情况:
其他情况均为后台应用。
1.前台Service:
从Android8.0之前,可以通过一个startService来打开一个Service,该Service就是一个后台Servcie;但是从Android8.0开始,系统限制了处于后台的APP来创建后台Service,通过startForegroundService()来打开一个前台Service,但是当系统创建好这个前台Service的时候,应用必须在5s内调用Service.startForeground()来显示一个通知,否则系统会停止这个前台Service,并弹出ANR。
从Android9.0,如果创建前台Servce,还需要在AndroidManifest文件中声明android.permission.FOREGROUND_SERVICE权限,APP会自动授权,否则会抛出异常。
2.后台Service
当APP处于前台的时候,可以任意创建和使用后台Service。官方建议使用JobScheduler代替后台Service
从Android11已经弃用了对Toast调用setView(),当然只是不允许从后台显示自定义View的Toast,即如果APP进入后台还想显示Toast,只能使用Toast.makeText()。
getView()、getHorizontalMargin()、getVerticalMargin()、getGravity()、getXOffset()getYOffset()、setMargin()、setGravity()方法将会失效,方法不能返回实际值,不要在业务逻辑中依赖接口的返回值。
从Android11开始,APP必须加上V2签名方式,否则无法安装和更新。
只是部分总结了Android Q R的一些适配原则,还要继续去研究。从Android10开始,Android系统也逐步在增加用户的隐私,限制APP访问权限,例如:
- 1.Android11提供了权限一次申请临时授权功能,有效性有一定的时效;
- 2.从Android10之后,Mac地址已经随机分配、IMEI、序列号这些信息已经无权限获取,这些APP的已经不能做为设备的唯一标示;
- 3.从Android10之后,如果要后台获取位置权限,则需要申请ACCESS_BACKGROUND_LOCATION权限;
- 4.从Android11开始,APP不能获取系统安装的其他APP的安装状态,但如果用户授权某些特定的APP,需要将包名加到AndroidManifest文件中;
- 5.从Android11开始,camera和microphone只能运行在前台,若要在service中使用camera和microphone,必须设置该service的foregroundServiceType为camera和microphone;
- 6.从Android11开始,自定义View的Toast不能在后台调用,在后台需要显示Toast的时候,只能使用Toast.makeText();
- 7.从Android11开始,必须使用V2的签名方式
Android的更多内容需要自己去学习,加油!!