蓝牙开启时Android运行时位置提醒对话框不显示问题求助
蓝牙开启时位置权限请求弹窗不显示的代码问题排查
我在蓝牙已开启的场景下请求位置权限,但系统的位置权限提醒弹窗始终不显示,麻烦帮忙排查以下代码中的问题:
public void requestRuntimePermission(Activity context){ if(ActivityCompat.checkSelfPermission(context, PERMISSION_LOCATION) == PackageManager.PERMISSION_GRANTED){ Toast.makeText(context,"Permission Granted. You can use API which requires the permission." , Toast.LENGTH_LONG).show(); }else if(ActivityCompat.shouldShowRequestPermissionRationale(context, PERMISSION_LOCATION)){ AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage("This app requires LOCATION permission for particular feature to work as expected.") .setTitle("Permission Required") .setCancelable(false) .setPositiveButton("Ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { ActivityCompat.requestPermissions(context, new String[]{PERMISSION_LOCATION}, PERMISSION_REQ_CODE); dialog.dismiss(); } }) .setNegativeButton("Cancel",(dialogInterface, i) -> dialogInterface.dismiss()); builder.show(); }else{ ActivityCompat.requestPermissions(context, new String[]{PERMISSION_LOCATION}, PERMISSION_REQ_CODE); } } public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSION_REQ_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(context, "Permission Granted. You can use API which requires the permission.", Toast.LENGTH_LONG).show(); } else if (!ActivityCompat.shouldShowRequestPermissionRationale(context, PERMISSION_LOCATION)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage("This feature is unavailabel") .setTitle("Permission required") .setCancelable(false) .setNegativeButton("Cancel", ((dialogInterface, i) -> dialogInterface.dismiss())) .setPositiveButton("Settings", (dialogInterface, i) -> { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", context.getPackageName(), null); intent.setData(uri); context.startActivity(intent); dialogInterface.dismiss(); }); } else { requestRuntimePermission(context); } } }
问题排查与修复建议
1. 权限常量定义错误(最可能原因)
蓝牙相关功能需要的位置权限是ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION,请确认PERMISSION_LOCATION的定义是否正确:
// 正确的常量定义示例 private static final String PERMISSION_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
如果常量指向其他无关权限,系统不会触发位置权限弹窗。
2. AndroidManifest.xml未声明权限
动态请求权限的前提是在Manifest中声明对应权限,否则系统会直接拒绝请求且不弹窗。请添加以下声明:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 若需要高精度位置,补充下面的权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 12+ 蓝牙扫描需单独权限(无需位置时可添加) --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
3. onRequestPermissionsResult中的弹窗未显示
代码中引导用户去设置页的AlertDialog创建后未调用show()方法,导致用户看不到权限引导弹窗,修复如下:
else if (!ActivityCompat.shouldShowRequestPermissionRationale(context, PERMISSION_LOCATION)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage("This feature is unavailable") .setTitle("Permission required") .setCancelable(false) .setNegativeButton("Cancel", ((dialogInterface, i) -> dialogInterface.dismiss())) .setPositiveButton("Settings", (dialogInterface, i) -> { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", context.getPackageName(), null); intent.setData(uri); context.startActivity(intent); dialogInterface.dismiss(); }); builder.show(); // 新增这一行 }
4. 用户已勾选"不再询问"
如果用户之前拒绝权限时勾选了"不再询问",shouldShowRequestPermissionRationale会返回false,此时系统不会再弹出权限请求弹窗,代码会进入引导去设置页的分支(修复后会显示对应弹窗)。
5. 上下文有效性问题
确认onRequestPermissionsResult中使用的context是当前有效的Activity实例,避免因上下文为空导致流程异常。
内容的提问来源于stack exchange,提问作者jyohya
相关产品推荐
相关产品推荐

