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
相关产品推荐
相关产品推荐

