You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否需将Android SDK从11升级至12以满足应用商店最新发布要求?

针对Android应用升级targetSdkVersion至31的适配解答

关于SDK版本与构建工具的疑问

首先纠正一个概念混淆:你提到的“SDK 11”应该是指minSdkVersion(最低兼容Android版本,对应Android 3.0),而Android 12对应的SDK版本号是31,并非“SDK 12”——系统版本号(Android 12)和SDK版本号(31)是对应的不同标识。

当你将targetSdkVersion升级至31时,强烈建议同步将compileSdkVersion也升级到31,原因如下:

  • compileSdkVersion指定编译时使用的SDK版本,与targetSdkVersion保持一致能让编译工具检测出Android 12的API变更、权限限制等问题,提前规避适配风险
  • 确保你能使用Android 12对应的最新编译工具链,避免出现兼容性编译错误

至于buildToolsVersion,只需升级到与compileSdkVersion 31兼容的版本即可(比如31.0.0及以上),无需刻意对应某个系统版本号。

蓝牙功能的运行时权限适配(Android 12+)

Android 12对蓝牙权限做了细分,不再依赖旧的BLUETOOTH/BLUETOOTH_ADMIN权限,需要针对不同系统版本做兼容处理:

1. Manifest权限声明

<!-- 兼容Android 11及以下版本 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />

<!-- Android 12+ 专属权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<!-- 若蓝牙扫描无需关联位置,添加此flag避免申请位置权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />

2. 动态权限申请

BLUETOOTH_SCAN和BLUETOOTH_CONNECT都是危险权限,必须在代码中动态申请,示例如下(Kotlin):

private const val REQUEST_BLUETOOTH_PERMISSIONS = 1001

// 权限申请逻辑
fun requestBluetoothPermissions() {
    val permissions = mutableListOf<String>()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        permissions.add(Manifest.permission.BLUETOOTH_SCAN)
        permissions.add(Manifest.permission.BLUETOOTH_CONNECT)
    } else {
        permissions.add(Manifest.permission.BLUETOOTH)
        permissions.add(Manifest.permission.BLUETOOTH_ADMIN)
        permissions.add(Manifest.permission.ACCESS_FINE_LOCATION)
    }
    ActivityCompat.requestPermissions(this, permissions.toTypedArray(), REQUEST_BLUETOOTH_PERMISSIONS)
}

// 权限申请结果回调
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == REQUEST_BLUETOOTH_PERMISSIONS) {
        // 处理权限授权结果,比如判断是否所有必要权限都已授权,再执行蓝牙操作
    }
}

3. 注意事项

  • 申请权限前,务必向用户清晰说明权限用途(比如“需要蓝牙权限扫描设备并建立连接”),提升授权通过率
  • 若使用neverForLocation flag,不能通过蓝牙扫描结果获取位置相关信息,否则会触发权限异常
  • 测试时需覆盖Android 12及以下版本的设备,确保权限逻辑在不同系统版本下都能正常运行

内容的提问来源于stack exchange,提问作者Marinus Snyman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:43:36