版本适配

168 阅读6分钟

Android7.0 版本适配:

1.  fileprovider应用间共享文件 ([file://uri]() => content://uri)

2.  **V2签名**

3. **WebView问题**

    a)    Android 7.0 WebView 部分机型打不开;

    b)    Android 7.0 WebView 二级跳转后界面空白;

4.  **Toast导致的BadTokenException**

Android8.0 版本适配:


1.  **权限组(当前不再自动赋予权限,下次申请时才自动赋予)**

2.  **通知适配(比如通知渠道、通知标志、通知超时、背景颜色)**

3.  **悬浮窗适配 (窗口类型改变)**

    a)    8.0及以上为WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

    b)    8.0以下为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

4.  **安装apk**
    Android 8.0去除了“允许未知来源”选项,所以如果我们的App有安装App的功能(检查更新之类的),那么会无法正常安装。
    需在AndroidManifest文件中添加安装未知来源应用的权限android.permission.REQUEST_INSTALL_PACKAGES;

5.  **后台服务限制:Android 8.0(+) 不再允许后台service直接通过startService方式去启动**

6.   **广播限制:除了少数例外情况外,应用无法使用其清单注册隐式广播**

7.  **当一个 Activity 固定方向并且是透明的,在8.0的版本中就会抛出异常**

Android9.0 版本适配:  

1.  **在9.0中默认情况下启用网络传输层安全协议 (TLS),默认情况下已停用明文支持。也就是不允许使用http请求,要求使用https。**

2.  **前台服务权限**

    a)    在 Android 9.0 中,应用在使用前台服务之前必须先申请 FOREGROUND_SERVICE 权限,否则就会抛出 SecurityException 异常;

    b)    此外由于FOREGROUND_SERVICE 权限只是普通权限,因此开发者只需在 AndroidManifest.xml 中注册此权限即可,系统会自动对此权限进行授权。

3.  **在9.0 中,不能直接非 `Activity` 环境中(比如`Service`,`Application`)启动 `Activity`,否则会崩溃报错:**
    android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.

    这类问题一般会在点击推送消息跳转页面这类场景,解决方法就是 Intent 中添加标志`FLAG_ACTIVITY_NEW_TASK`,

Android10.0 版本适配:  

1.   **存储权限(分区存储)**

2.  **后台定位权限(`ACCESS_BACKGROUND_LOCATION`)官方推荐使用**前台服务**来实现,在前台服务中获取位置信息。**

3.  **后台启动 Activity 的限制:应用处于后台时,无法启动Activity(不是绝对的)。**

4.  **设备唯一标识符**

5.  **深色主题**

Android11.0 版本适配:  


1.  **存储机制更新:Scoped Storage(强制分区存储)**

2.  **权限改变:单次权限授权(如麦克风、相机、定位。。。)**

3.  **软件包可见性**
    软件包可见性是Android 11上提高体系隐私安全性的一个新特性。它的效果是束缚app随意获取其他app的信息和设备状况。
    避免病毒软件、间谍软件利用,引发网络垂钓、用户设备信息走漏等安全事情。
    解决办法:在AndroidManifest.xml中增加queries元素,里面增加需求可见的应用包名;
    
4.  **前台服务类型**
    Android 10中,在前台服务访问位置信息,需要在对应的`service`中添加 `location` 服务类型。
    同样的,Android 11中,在前台服务访问摄像头或麦克风,需要在对应的`service`中添加`camera``microphone` 服务类型。
    <service 
        android:name="MyService" 
        android:foregroundServiceType="microphone|camera" />

5.  **无线调试**

Android12.0 版本适配:


1.  **清单文件四大组件android:exported="" 必配**

2.   **Notification通知栏:从Andorid 12开始,系统再次更改了自定义通知栏的布局方式和样式。**
    
3.   **前台服务:将`禁止从后台启动前台服务`,并对启动前台服务作了限制。**

4.  **蓝牙权限**

    Android 12 引入了 `BLUETOOTH_SCAN``BLUETOOTH_ADVERTISE``BLUETOOTH_CONNECT` 权限。
    这些权限可让以 Android 应用更轻松地与蓝牙设备互动,`不再需要申请设备位置信息相关权限`。

    Android 12 开始,Google官方将`蓝牙扫描``位置权限`进行了分离,因为官方发现:
    `在隐私层面上,很难向终端用户解释位置权限与蓝牙的关系`

Android13.0 版本适配:


1.  **通知权限**

    通知栏消息一直是App和用户沟通的有效渠道。在Android13之前,App只需要使用NotificationManager即可向终端用户推送通知栏消息。Android13则引入了新的运行时通知权限:POST_NOTIFICATIONS。

    开发者需要在AndroidManifest.xml中声明POST_NOTIFICATIONS权限,还需要在使用通知栏推送功能时在代码中申请运行时权限,**一旦被用户拒绝授权,下次系统将不会再出现权限申请的弹窗。**

2.  **更细分的媒体权限**

    对于目标版本为 Android 13 的情况,现在READ_EXTERNAL_STORAGE权限被细化了,开发者需要使用`READ_MEDIA_IMAGE`、`READ_MEDIA_VIDEO`、`READ_MEDIA_AUDIO` 来替代适配

    我们发现,单独请求READ_MEDIA_IMAGES、单独请求 READ_MEDIA_VIDEO和同时请求READ_MEDIA_IMAGES& READ_MEDIA_VIDEO,系统均将只显示一个授权弹窗

    另外,如果App(targetSdk == 33)已经申请了读的权限,那App同时也就有了写的权限,无需再额外声明 WRITE_EXTERNAL_STORAGE权限

3.  **从Android 13(API 33)开始,Android通知栏中新增了一项新特性:**
    **用户可以选择在通知栏中通过“前台服务管理器”,对“正在运行的前台服务”进行停止操作。**

Android14.0 版本适配:

1.   **前台服务类型**
    在 targetSdkVersion >= 34 的情况下,必须为应用内的每个前台服务(Foreground Service)指定至少一种前台服务类型。
    通过android:foregroundServiceType可以指定<service>的服务类型

2.   **对隐式 Intent 和 PendingIntent 的限制**

    1)隐式Intent只能传递给android:exported="true"的组件(四大组件:Activity、Service…)。
    所以在App中使用Intent传递数据,要么使用显式Intent传递给android:exported="false"的组件,
    要么使用隐式Intent传递给android:exported="true"的组件,当然显式Intent传给exported="true"肯定也是可以的。

    2)一个可变的 PendingIntent 必须设置packageName,否则会抛出异常。

3.   **动态广播接收器必须指定导出的行为**

    动态注册的广播接收器必须设置一个标记,用于表明接收器是否被导出到设备上的所有 App。
    标记位是RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED。
    早在 Android13 就引入了这个功能,可以让应用程序指定一个已注册的广播接收器是否应该被导出,并对设备上的其他应用可见。

    只不过在 Android14 上变成了“必须设置”。而在以前的 Android 版本中,设备上的任何应用都可以向动态注册的广播接收器发送未受保护的广播,除非该接收器有签名许可。
    
4.   **新 API:直接监听截屏操作,不用再观察媒体文件了~**