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

Android蓝牙扫描权限弹窗创建后立即消失,如何排查解决?

Android BLUETOOTH_SCAN权限弹窗瞬间消失问题

我在Android程序中调用ActivityResultLauncher#launch()请求BLUETOOTH_SCAN运行时权限,本该弹出的权限对话框不到半秒就消失了,求排查问题。

权限请求代码片段

主Activity中发起权限请求的代码:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) {
        Log.i(TAG, "Bluetooth scan permission denied. Requesting...");
        requestPermissionLauncher.launch(Manifest.permission.BLUETOOTH_SCAN);
        Log.i(TAG, "Permission requested. Awaiting user response");
        return;
}

requestPermissionLauncher的定义:

private ActivityResultLauncher<String> requestPermissionLauncher =
            registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                Log.i(TAG, "Requested permission granted!");
                scanLeDevice();
            } else {
                Log.e(TAG, "Requested permission denied!");
                Toast.makeText(this, "Permission denied! Sorry, we can't continue.", Toast.LENGTH_LONG);
            }
        });

关键Logcat日志

---------------------------- PROCESS STARTED (4871) for package com.example.ble_imu_data_viewer ----------------------------
...
2023-06-11 19:57:01.623  4871-4871  important_info          com.example.ble_imu_data_viewer      I  Bluetooth scan permission denied. Requesting...
2023-06-11 19:57:01.648  4871-4871  important_info          com.example.ble_imu_data_viewer      I  Permission requested. Awaiting user response
2023-06-11 19:57:01.709  4871-4871  ActivityThread          com.example.ble_imu_data_viewer      D  add activity client record, r= ActivityRecord{af555b6 token=android.os.BinderProxy@5980385 {com.example.ble_imu_data_viewer/com.example.ble_imu_data_viewer.MainActivity}} token= android.os.BinderProxy@5980385
...
2023-06-11 19:57:11.906  4871-4871  important_info          com.example.ble_imu_data_viewer      E  Requested permission denied!
...

Manifest权限声明

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" tools:remove="android:maxSdkVersion"/>

问题排查与解决方案

1. 调整权限请求时机

从日志时间差看,权限请求发起10秒后才触发拒绝回调,说明系统可能自动拦截了弹窗。不要在Activity的onCreate、onStart等早期生命周期直接发起请求,此时Activity未完全初始化,弹窗会被系统屏蔽。建议:

  • 将请求延迟到onResume执行完成后,比如用postDelayed延迟几百毫秒
  • 改为通过用户交互(如点击按钮)触发权限请求

2. 修复Toast调用错误

回调中的Toast没有调用show()方法,导致权限拒绝的提示不会显示,修正代码:

Toast.makeText(this, "Permission denied! Sorry, we can't continue.", Toast.LENGTH_LONG).show();

3. 检查版本适配逻辑

BLUETOOTH_SCAN权限在Android 12(API 31)及以上才需要单独申请,需确认:

  • build.gradle中targetSdkVersion设置为31或更高
  • 若适配Android 13+,需同步确认是否需声明BLUETOOTH_CONNECT等关联权限

4. 排查系统权限状态

部分华为/荣耀设备的权限管理有特殊逻辑,可先去系统设置查看应用的蓝牙权限状态:如果权限被设为**"拒绝且不再询问"**,系统会直接自动拒绝请求,不会弹出弹窗,此时需要引导用户手动开启权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:24:55