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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:32:06