天天看点

Android Q R的适配(二)-隐私权限前言一 隐私权变更二 其他内容

前言

        在AndroidQ R及以上的适配(一)-分区存储的适配中主要对AndroidQ及以上的分区存储做了简单的适配分析,针对其他的适配在简单总结下。

一 隐私权变更

1.  权限一次性授权   

        在Android11中,对于敏感的数据类型如位置信息、摄像头、麦克风,新增一次授权的临时访问权限,如图所示:

Android Q R的适配(二)-隐私权限前言一 隐私权变更二 其他内容

        相对于从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的更多内容需要自己去学习,加油!!