targetSdkVersion提高后需要适配的新版本的行为变更

一)将 targetSdkVersion 提高后,需要适配 Android 新版本的行为变更(Behavior Changes),以确保应用在更高版本的系统中正常运行。以下是主要适配点(以最新 Android 版本为例):

关键适配项(按版本分类)

Android 14(API 34)
  1. 前台服务类型(Foreground Service)

    • 必须声明具体的前台服务类型(如 cameralocation),否则会抛出异常。

    • 适配方法:在 AndroidManifest.xml 中声明 <uses-permission> 并指定 android:foregroundServiceType

  2. 隐式广播限制

    • 针对非导出(exported=false)的广播接收器,限制接收隐式广播。

    • 适配方法:使用显式 Intent 或动态注册广播。

  3. 照片和视频选择器

    • 访问用户媒体文件需使用系统选择器(PhotoPicker),而非直接请求 READ_MEDIA_IMAGES 权限。

  4. 非线性字体缩放

    • 默认禁止非系统字体缩放超过 2.0,需适配 dp 单位或检查布局。


Android 13(API 33)
  1. 通知权限(POST_NOTIFICATIONS)

    • 新增运行时通知权限,需动态请求 Manifest.permission.POST_NOTIFICATIONS

  2. 附近 Wi-Fi 设备权限

    • 访问附近 Wi-Fi 设备需申请 NEARBY_WIFI_DEVICES 权限,替代 ACCESS_FINE_LOCATION

  3. Intent 过滤器限制

    • 向其他应用的未导出组件发送 Intent 会失败,需对方组件标记为 exported=true 或使用 PendingIntent


Android 12(API 31)
  1. PendingIntent 可变性

    • 必须显式声明 PendingIntent 的可变性(FLAG_IMMUTABLE 或 FLAG_MUTABLE)。

  2. 大致位置(BLUETOOTH_SCAN)

    • 蓝牙扫描需声明 android:usesPermissionFlags="neverForLocation" 以避免定位权限。

  3. 前台服务启动限制

    • 后台应用启动前台服务需添加 HIGH_QUALITY 服务类型。


Android 11(API 30)
  1. 分区存储(Scoped Storage)

    • 默认限制访问外部存储,需使用 MediaStore 或申请 MANAGE_EXTERNAL_STORAGE(需上架审核)。

  2. 单次权限(One-time permissions)

    • 用户可选择授予临时权限(如位置),需处理权限失效后的逻辑。


Android 10(API 29)
  1. 设备标识符限制

    • 禁止非特权应用访问 IMEI 等设备标识符,需使用 ANDROID_ID 或广告 ID。

  2. 后台位置权限

    • 需动态请求 ACCESS_BACKGROUND_LOCATION 并说明用途。


通用适配步骤

  1. 测试兼容性

    • 在真机或模拟器上测试高版本系统的行为变更。

    • 使用 adb 命令模拟权限变更(如 adb shell pm revoke <package> android.permission.XXX)。

  2. 检查清单文件

    • 更新 <uses-permission> 和 <uses-feature> 声明。

    • 确保 android:exported 属性显式定义(Android 12+ 强制要求)。

  3. 更新第三方库

    • 确保依赖库支持高版本 targetSdkVersion(如 Glide、OkHttp、Firebase)。

  4. 处理权限回调

    • 适配 ActivityResultLauncher(替代 onRequestPermissionsResult)。


示例代码(Android 13 通知权限)

java

复制

// 检查并请求通知权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) 
        != PackageManager.PERMISSION_GRANTED) {
        requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
    }
}

注意事项

  • 逐步升级:建议逐个版本升级(如从 30 → 31 → 33),而非直接跳到最新。

  • 官方文档:参考 Android 行为变更文档 获取完整列表。

通过以上适配,可以避免因 targetSdkVersion 升级导致的崩溃或功能异常。

二)Android 12 targetSdkVersion 31兼容性修改指南

当将 targetSdkVersion 升级到 31(Android 12) 时,需要重点关注以下兼容性修改点,以确保应用在新版本上的正常运行:

1. 精确的组件导出(Exported Components)

问题:Android 12 要求所有声明 <intent-filter> 的组件(Activity、Service、Receiver)必须显式设置 android:exported="true|false"
修改
在 AndroidManifest.xml 中为相关组件添加 exported 属性:

xml

复制

<activity
    android:name=".MyActivity"
    android:exported="true">  <!-- 明确是否需要被其他应用访问 -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
    </intent-filter>
</activity>

<receiver
    android:name=".MyBroadcastReceiver"
    android:exported="false"> <!-- 仅内部使用 -->
</receiver>

运行 HTML


2. 蓝牙权限变更

问题:Android 12 引入了新的蓝牙权限 BLUETOOTH_SCANBLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT,替代旧的 BLUETOOTH 和 BLUETOOTH_ADMIN
修改

  • 在 AndroidManifest.xml 中声明所需权限:

    xml

    复制

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

    运行 HTML

  • 动态请求权限(针对 Android 12+ 设备):

    java

    复制

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        requestPermissions(new String[]{
            Manifest.permission.BLUETOOTH_SCAN,
            Manifest.permission.BLUETOOTH_CONNECT
        }, REQUEST_CODE);
    }

3. 前台服务启动限制

问题:Android 12 禁止后台应用启动前台服务(少数特殊情况除外)。
修改

  • 使用 startForegroundService() 时,确保从用户可见的上下文(如 Activity)调用。

  • 考虑使用 WorkManager 替代后台任务。


4. 自定义通知样式变更

问题:Android 12 要求自定义通知必须提供标准模板(如 Notification.DecoratedCustomViewStyle)。
修改
在创建通知时添加样式:

java

复制

Notification.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.icon)
    .setContentTitle("Title")
    .setContentText("Message")
    .setStyle(new Notification.DecoratedCustomViewStyle()) // 添加默认样式
    .build();

5. 应用休眠(App Hibernation)

问题:如果用户长时间未使用应用,系统会自动重置其运行时权限并强制停止应用。
修改

  • 在关键操作前检查权限是否被撤销:

    java

    复制

    if (checkSelfPermission(Manifest.permission.CAMERA) != PERMISSION_GRANTED) {
        // 重新请求权限
    }

6. 隐私仪表板与麦克风/摄像头访问

问题:Android 12 在状态栏显示麦克风/摄像头使用指示器,并允许用户通过快捷设置禁用访问。
修改

  • 在访问麦克风或摄像头前,检查硬件是否可用:

    java

    复制

    PackageManager pm = getPackageManager();
    boolean hasCamera = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
  • 处理用户突然禁用权限的情况(捕获 SecurityException)。


7. 兼容性测试建议

  1. 测试组件导出:确保无用的组件未意外暴露(安全风险)。

  2. 测试蓝牙功能:验证新权限是否正常工作。

  3. 模拟应用休眠:通过命令强制休眠应用测试恢复逻辑:

    bash

    复制

    adb shell am suspend com.your.package

其他注意事项

  • PendingIntent 可变性:Android 12 要求明确指定 PendingIntent 的 mutability(FLAG_IMMUTABLE 或 FLAG_MUTABLE)。

  • 新的应用启动动画:适配新的启动画面(Splash Screen API)。

  • 性能分析:使用 Android Studio 的 Profiler 检测升级后的性能影响。

通过以上修改,可以确保应用在 Android 12 上保持兼容性和用户体验。建议参考 官方迁移指南 获取完整细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值