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

Android Studio中Java蓝牙控制APP无响应及崩溃问题求助

蓝牙控制APP问题修复

核心问题定位

代码存在几个关键错误,导致按钮无响应和崩溃:

  • 权限检查逻辑错误:hasPermissions方法循环中第一个权限检查后直接返回false,永远无法正确判断所有权限是否授权。
  • Log对象空指针:声明了Log log = null;,调用log.d()会触发空指针异常,导致权限请求代码执行失败,按钮监听逻辑可能未正常初始化。
  • Manifest权限书写错误:BLUETOOTH_BLUETOOTH_SCAN是重复错误的权限名,应为BLUETOOTH_SCAN。
  • 关闭蓝牙未做权限校验:Android 12+关闭蓝牙需要BLUETOOTH_CONNECT权限,直接调用disable()会因权限不足崩溃。

代码修复方案

1. 修复权限检查方法

修改hasPermissions,确保遍历所有权限后再返回结果:

private boolean hasPermissions(String[] permissions) {
    if (permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(MainActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
                Log.d("PERMISSIONS", "Permission is not granted: " + permission);
                return false; // 有一个权限未授权就返回false
            }
        }
        return true; // 所有权限都授权才返回true
    }
    return true;
}

2. 移除错误的Log实例化

删除Log log = null;,所有日志直接用Log静态方法,修改askPermissions:

private void askPermissions(ActivityResultLauncher<String[]> multiplePermissionLauncher){
    if (!hasPermissions(PERMISSIONS)) {
        Log.d("PERMISSIONS", "Launching multiple contract permission launcher for ALL required permissions");
        multiplePermissionLauncher.launch(PERMISSIONS);
    } else {
        Log.d("PERMISSIONS", "All permissions are already granted");
    }
}

3. 修正Manifest权限

把错误的权限名改成正确的:

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- 移除错误的BLUETOOTH_BLUETOOTH_SCAN权限 -->

4. 修复关闭蓝牙的权限校验

在关闭蓝牙前增加权限检查,避免崩溃:

@SuppressLint("MissingPermission")
private void bluetoothOFFMethod() {
    OFF.setOnClickListener(v -> {
        // 先检查BLUETOOTH_CONNECT权限
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplicationContext(), "需要蓝牙连接权限才能关闭蓝牙", Toast.LENGTH_LONG).show();
            multiplePermissionLauncher.launch(new String[]{Manifest.permission.BLUETOOTH_CONNECT});
            return;
        }
        if (myBluetoothAdapter != null && myBluetoothAdapter.isEnabled()) {
            myBluetoothAdapter.disable();
            Toast.makeText(getApplicationContext(), "蓝牙已关闭", Toast.LENGTH_LONG).show();
        }
    });
}

新手调试技巧

  • 过滤Logcat日志:在Android Studio的Logcat面板选择你的APP包名(com.project.btseat),只查看自身APP日志,崩溃时会在这里看到异常堆栈信息。
  • 设置断点调试:在onCreate、askPermissions、按钮点击方法的代码行号左侧点击设置断点,启动调试模式后,执行操作会停在断点处,逐行查看变量值和执行流程。
  • 手动检查权限:在系统设置Settings -> Apps -> 你的APP -> Permissions中查看权限是否被授予,排除权限未授权的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:30:26