欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > targetSdkVersion提高后需要适配的新版本的行为变更

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

2025/4/8 10:33:48 来源:https://blog.csdn.net/u013083465/article/details/147044296  浏览:    关键词: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

复制

<activityandroid:name=".MyActivity"android:exported="true">  <!-- 明确是否需要被其他应用访问 --><intent-filter><action android:name="android.intent.action.VIEW" /></intent-filter>
</activity><receiverandroid: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 上保持兼容性和用户体验。建议参考 官方迁移指南 获取完整细节。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词