缺少 BluetoothAdapter.isEnabled.BLUETOOTH 所需的权限

missing permissions required by BluetoothAdapter.isEnabled.BLUETOOTH

我将蓝牙添加到我的应用程序,但 运行 遇到以下问题。当我执行代码时:

BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
    Toast.makeText(getApplicationContext(),"Device doesnt Support Bluetooth",Toast.LENGTH_SHORT).show();
}

if(!bluetoothAdapter.isEnabled()) {
    Intent enableAdapter = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableAdapter, 0);
}

错误在以下行:

if(!bluetoothAdapter.isEnabled())

错误:

Missing permissions required by BluetoothAdapter.isEnabled :android.permissions.BLUETOOTH

我向 android 清单文件添加了以下权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<permission android:name="android.permission.BLUETOOTH" android:label="BLUETOOTH" />
<permission android:name="android.permission.BLUETOOTH_ADMIN" />

但我仍然遇到同样的问题。你知道我做错了什么吗?

假设您有一个按钮,然后单击它,蓝牙需要打开。这是一个简单的示例,您将如何为 Android 6.0 及更高版本执行此操作。

首先,在 Activity/Fragment:

中声明这个变量
public static final int PERMISSION_ASK = 1001;

现在,假设此按钮将启用蓝牙。 setOnClickListener:

myButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if(isBluetoothPermissionGranted()) {
                // app already has required permissions
                // do some task here
            } else {
                // app does not have permission yet.
                // ask for permissions
                askForBluetoothPermissions();
            }
        } else {
            // Android version below 6.0, no need to check or ask for permission
            // do some task here
        }
    }
});

正在检查应用程序是否已经拥有所需的权限:

@RequiresApi(api = Build.VERSION_CODES.M)
private boolean isBluetoothPermissionGranted() {
    boolean granted = false;
    int bluetoothGranted = checkSelfPermission(Manifest.permission.BLUETOOTH);
    int bluetoothAdminGranted = checkSelfPermission(Manifest.permission.BLUETOOTH_ADMIN);

    if(bluetoothGranted == PackageManager.PERMISSION_GRANTED &&
            bluetoothAdminGranted == PackageManager.PERMISSION_GRANTED) {
        granted = true;
    }

    return granted;
}

如果所需的权限未被授予,请按以下方式申请:

@RequiresApi(api = Build.VERSION_CODES.M)
private void askForBluetoothPermissions() {
    String[] permissions = new String[] {
            Manifest.permission.BLUETOOTH,
            Manifest.permission.BLUETOOTH_ADMIN
    };
    requestPermissions(permissions, PERMISSION_ASK);
}

最后,您可以通过以下方式确认用户是否授予您权限:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_ASK:
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                // all requested permissions were granted
                // perform your task here
            } else {
                // permissions not granted
                // DO NOT PERFORM THE TASK, it will fail/crash
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            break;
    }
}

希望对您有所帮助

  1. 您只需要 <uses-permission> 标记,因为您正在使用权限。您不需要 <permissions> 标签,因为这不是您的自定义权限。
  2. 也许您将 <uses-permission> 标签放在清单中的错误元素中,但我无法根据您提供的信息说任何其他内容
  3. 由于您的 bluetoothAdapter 可以为空,请添加到第二个 IF 空指针检查,或者在第一个 IF
  4. 中添加一个 RETURN
  5. <uses-feature>标签也不错

对于 Android 6.0 及更高版本,您必须将以下内容添加到清单文件

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<permission android:name="android.permission.BLUETOOTH" android:label="BLUETOOTH" />
<permission android:name="android.permission.BLUETOOTH_ADMIN" />
<permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<permission android:name="android.permission.ACCESS_COARSE_LOCATION" />