flutter iOS上的蓝牙错误、CoreBluetooth API误用和检测蓝牙权限

nwwlzxa7  于 2023-03-31  发布在  Flutter
关注(0)|答案(1)|浏览(656)

bounty将在6天后过期。回答此问题可获得+50声望奖励。kbessemer希望引起更多人对此问题的关注:我需要知道如何检测用户何时拒绝了我的应用扫描和连接BLE设备所需的权限,这是一个Flutter应用,目前使用flutter_blue_plus和permission_handler

我正在使用www.example.com上提供的flutter_blue_pluspub.dev和permissions_handler来向用户请求所需的权限。
在Android上,我看到一个PlatformException错误,代码为“no_permissions”......但在iOS上,我没有看到这个错误,而是每次第一次启动应用程序时都会收到这个错误:
[CoreBluetooth] API误用:〈CBCentralManager:0x 283 e7 f160〉只能在通电状态下接受此命令
为了处理这个错误,我只是再次请求扫描。为什么会发生这个错误?
我如何检测到用户拒绝了我的蓝牙功能所需的权限?
我尝试过的事情:

void RequestPermission() async {
    PermissionStatus locationPermission = await Permission.location.request();
    PermissionStatus bleScan = await Permission.bluetoothScan.request();
    PermissionStatus bleConnect = await Permission.bluetoothConnect.request();
    if (locationPermission.isDenied || locationPermission.isPermanentlyDenied || bleScan.isDenied || bleScan.isPermanentlyDenied || bleConnect.isDenied || bleConnect.isPermanentlyDenied) {
      Navigator.push(
          context,
          MaterialPageRoute(
              builder: (context) => BluetoothDisabledView()
          )
      );
    }
  }

上面的代码在iOS上一直将用户发送到BluetoothDisabledView,而没有向用户呈现任何对话/权限请求。我正在使用此包获取权限:https://pub.dev/packages/permission_handler
我应该在iOS上查找什么来检测我们是否具有所需的权限?

wgx48brx

wgx48brx1#

如果用户拒绝了Flutter应用在iOS上扫描和连接BLE设备所需的权限,您可以使用permission_handler包。基本上,您可以使用Permission类的check方法检查locationbluetoothPeripheral权限的状态。
因此,如果状态为deniedpermanentlyDenied,则可以假定用户已拒绝权限并采取适当的操作,例如显示消息或将其重定向到设置页面。
关于您在iOS上遇到的“API误用”错误,如果您在蓝牙子系统完全打开之前尝试访问蓝牙功能,则可能会发生此错误。
因此,为了避免这个错误,您可以在执行任何操作之前使用FlutterBlue示例的state属性来检查用户的蓝牙是否通电。如下图所示:

final flutterBlue = FlutterBlue.instance;

if (flutterBlue.state == BluetoothState.poweredOn) {
  // Perform Bluetooth operations
} else {
  // Wait for Bluetooth to power on
  await flutterBlue.state.firstWhere((state) => state == BluetoothState.poweredOn);
  // Perform Bluetooth operations
}```

相关问题