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

蓝牙开启时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:50:36