Android 10设备BLUETOOTH_CONNECT权限无弹窗且无法设置的问题排查
问题分析与解决方案
核心问题是蓝牙权限的版本兼容性——BLUETOOTH_CONNECT是Android 12(API 31)才引入的权限,Android 10(API 29)系统根本不识别这个权限,所以你请求它时不会弹出权限弹窗,系统直接判定为拒绝,设置里也找不到该选项。
不同Android版本的蓝牙权限要求
- Android 12+(API 31及以上):需要
BLUETOOTH_CONNECT运行时权限,用于连接已配对的蓝牙设备。 - Android 10-11(API 29-30):没有
BLUETOOTH_CONNECT权限,需请求ACCESS_FINE_LOCATION运行时权限(系统要求蓝牙操作必须关联位置权限,防止通过蓝牙扫描泄露位置),同时需要在Manifest中声明BLUETOOTH和BLUETOOTH_ADMIN权限。 - Android 9及以下:
BLUETOOTH和BLUETOOTH_ADMIN属于正常权限,无需运行时请求,直接在Manifest声明即可。
具体修复步骤
1. 更新AndroidManifest.xml权限声明
在AndroidManifest.xml中添加分版本的权限:
<!-- 基础蓝牙权限,所有版本必需 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 10+ 蓝牙操作所需的位置权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 12+ 专属蓝牙权限,仅在API 31+生效 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:minSdkVersion="31" />
2. 在AndroidLauncher中适配权限请求(Java代码)
在LibGDX的AndroidLauncher类中,根据系统版本动态请求对应权限:
import android.Manifest; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; public class AndroidLauncher extends AndroidApplication { private static final int PERMISSION_REQUEST_CODE = 100; private YourGame gameInstance; // 替换为你的游戏主类 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gameInstance = new YourGame(); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); if (checkRequiredPermissions()) { initialize(gameInstance, config); } else { requestRequiredPermissions(); } } private boolean checkRequiredPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ 检查BLUETOOTH_CONNECT权限 return checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // Android 10-11 检查位置权限 return checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; } else { // Android 9及以下无需运行时权限 return true; } } private void requestRequiredPermissions() { String[] permissions; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { permissions = new String[]{Manifest.permission.BLUETOOTH_CONNECT}; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION}; } else { permissions = new String[]{}; } requestPermissions(permissions, PERMISSION_REQUEST_CODE); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { boolean allGranted = true; for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allGranted = false; break; } } AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); if (allGranted) { initialize(gameInstance, config); } else { // 权限被拒绝,可提示用户后退出或做其他处理 finish(); } } } }
3. 注意事项
- Android 10中,即使连接已配对的蓝牙设备,也必须授予位置权限,否则蓝牙SPP连接会失败。
- 测试时确保在Android 10设备上请求的是
ACCESS_FINE_LOCATION而非BLUETOOTH_CONNECT。
内容的提问来源于stack exchange,提问作者1615
相关产品推荐
相关产品推荐

