Android Q R的适配-隐私权限
Posted 好人静
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Q R的适配-隐私权限相关的知识,希望对你有一定的参考价值。
前言
在AndroidQ R及以上的适配(一)-分区存储的适配中主要对androidQ及以上的分区存储做了简单的适配分析,针对其他的适配在简单总结下。
一 隐私权变更
1. 权限一次性授权
在Android11中,对于敏感的数据类型如位置信息、摄像头、麦克风,新增一次授权的临时访问权限,如图所示:
相对于从Android6出现的动态申请权限,APP可以临时获得一次性权限,该使用时效范围为:
- 1.APP的Activity在用户授权之后,一直处于可见状态
- 2.APP处于后台的短时间内
- 3.APP前台一直运行着前台服务,即使用户切换到后台,该授权也会保留
所以对于APP如果不符合上述三种情况,该权限就会被收回,并且该APP的进程被杀掉。
权限一次性授权的适配
对于该内容的适配,APP在申请权限的时候,尽量不要申请与功能不相关的权限,并且如果用户拒绝了该权限,APP应提示用户该权限的作用,并且引导用户去设置界面,对该权限进行授权。
2.MAC地址随机分配
在Android10之前通常可以通过wifiInfo.getMacAddress()可以获取到设备的MAC地址,可以作为设备唯一标示的一部分,但是从Android10之后,系统会随机分配MAC地址,同时无法访问包含与设备的网络状态相关的信息的/proc/net,但可以使用NetworkStatsMananger或ConnectivityManager类进行获取
3.获取设备标识符权限
从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,该体系中有四种标示:
- (1)UDID:设备唯一标示符。设备生产或调用时生成。无法重置、始终不变,除非硬件改变;
- (2)OAID:匿名设备标示符。系统首次启动后立即生成。用户可手动重置、恢复出厂设置、设备商可重置、被刷机可重置;
- (3)VAID:开发者匿名设备标示符。可在应用安装时生成。恢复出厂设置、设备商可重置、被刷机可重置
- (4)AAID:应用匿名设备标示符。可在应用安装时生成。恢复出厂设置、设备商可重置、被刷机可重置
4.获取电话号码的权限
从Android11之前,只要用户同意授权READ_PHONE_STATE权限,就可以通过TelephonyManager或TelecomManager的getLine1Number()获取到电话号码,但从Android11开始,READ_PHONE_STATE权限已经不在使用,需要通过READ_PHONE_NUMBERS权限才可以获取。
获取电话号码的适配
需要在AndroidManifest声明权限的时候增加如下配置:
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="29" />
5.新增后台位置访问权限
从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权限,那么用户在同意授权之后,才可以在前后台进行访问位置权限;
6.应用可见性
在Android11之前,可以通过PackageManager中的getInstalledPackaged(0)或者访问Android/data/data下的内容来获取系统安装的所有APP,但从Android11开始,会限制APP去访问其他APP的信息和安装状态,如果APP一定要获取某些APP的信息,必须在AndroidManifest中声明这些APP的清单,例如:
- (1)在AndroidManifest增加特定APP的包名
<queries>
<package android:name="xx"/>
</queries>
- (2)在AndroidManifest增加能响应特定intent的APP
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:type="image/jpeg" />
</intent>
</queries>
- (3)申请 android.permission.QUERY_ALL_PACKAGES
但是第2和第3种方式会在Google Play上架应用的时候检测并限制这两种方式的使用。
7.前台服务
从Android11开始,APP只能在前台才能使用camera和microphone。当在service组件中使用camera和microphone的时候,必须为该service组件添加foregroundServiceType为camera和microphone,如:
<service ... android:foregroundServiceType="location|camera|microphone" />
8.后台启动Activity的限制
从Android10开始,系统会增加针对Activity后台启动的限制,即APP处于后台的时候打开Activity。这样可以减少用户行为的中断,让用户更好的控制屏幕中的内容。影响范围是非用户通过直观操作的打开的Activity。所谓的前台应用就是下面几种情况:
- (1)有可见的Activity
- (2)有前台Service
- (3)有其他APP通过bindservice或者ContentProvider连接到当前APP
其他情况均为后台应用。
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
二 其他内容
1.Toast
从Android11已经弃用了对Toast调用setView(),当然只是不允许从后台显示自定义View的Toast,即如果APP进入后台还想显示Toast,只能使用Toast.makeText()。
2.UI相关的某些方法获取失败
getView()、getHorizontalMargin()、getVerticalMargin()、getGravity()、getXOffset()getYOffset()、setMargin()、setGravity()方法将会失效,方法不能返回实际值,不要在业务逻辑中依赖接口的返回值。
3.APK签名方案V2
从Android11开始,APP必须加上V2签名方式,否则无法安装和更新。
- V1签名:对jar进行签名,仅对未压缩的文件内容进行了验证,在APK签名之后可以进行很多修改,例如文件可以移动或者重新压缩;
- V2签名:对整个APK文件进行验证,在构建过程中有任何定制任务,包括篡改或处理APK文件,都要禁用,否则会使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的更多内容需要自己去学习,加油!!
以上是关于Android Q R的适配-隐私权限的主要内容,如果未能解决你的问题,请参考以下文章