是否需将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. 注意事项
- 申请权限前,务必向用户清晰说明权限用途(比如“需要蓝牙权限扫描设备并建立连接”),提升授权通过率
- 若使用
neverForLocationflag,不能通过蓝牙扫描结果获取位置相关信息,否则会触发权限异常 - 测试时需覆盖Android 12及以下版本的设备,确保权限逻辑在不同系统版本下都能正常运行
内容的提问来源于stack exchange,提问作者Marinus Snyman
相关产品推荐
相关产品推荐

