Flutter 蓝牙定位权限

2024-07-31  本文已影响0人  渚清与沙白

在Android中,申请蓝牙权限需要申请定位权限的原因主要涉及到以下几点:

  1. 蓝牙扫描能暴露位置信息
    当应用进行蓝牙扫描时,特别是低功耗蓝牙(Bluetooth Low Energy, BLE)的扫描,扫描结果中的蓝牙设备列表可以反映出用户的位置信息。例如,在特定的地理位置,某些蓝牙设备(如商店、家庭、办公设备等)会唯一存在,因此通过蓝牙扫描结果可以推断用户的位置。

  2. 系统安全策略
    从Android 6.0(API 23)开始,Google出于隐私和安全的考虑,要求应用在使用蓝牙扫描功能时,需要申请与位置相关的权限。具体来说是ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限。这是因为扫描蓝牙设备可以间接地提供用户的位置信息,Google希望通过这种权限申请机制来保护用户的隐私。

  3. 应用权限管理
    通过强制要求蓝牙扫描权限与位置权限绑定,Android系统确保应用在获取蓝牙扫描结果前,明确告知用户应用可能会访问他们的位置信息。这使得用户在授权时可以更清楚地了解应用的行为。

权限申请插件:permission_handler: ^10.4.5

蓝牙权限:

定位权限:

注意:
在同时申请这三个定位权限时,用户授权后,检测授权状态,仍有个别是拒绝状态。但是,再次申请时,是已授权状态。

在Android上,如果你请求了多个权限,系统会按照请求的权限进行授权。如果应用首先请求了Permission.locationWhenInUse,系统可能会要求用户授权该权限,而Permission.locationAlways可能需要在应用已获得“仅在使用时”权限的情况下才能被授予。

所以,才会出现上述情况。于是,我们只申请 Permission.location 权限可以一次通过,不影响蓝牙搜索、连接、匹配及通信。

 Future _requestPermission() async {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.bluetoothAdvertise,
      Permission.bluetooth,
      Permission.bluetoothConnect,
      Permission.bluetoothScan,
      Permission.location,/// 有个别定位权限 在定位权限授权时,需要再次请求定位权限才会授权通过,需要再考虑添加
    ].request();
    //  Permission.locationAlways,
    //  Permission.locationWhenInUse,  这两个权限需要Permission.location授权之后再次申请
    bool granted = true;
    statuses.forEach((key, value) {
      if (value != PermissionStatus.granted) {
        granted = false;
      }
    });
    if (granted) {
      /// 开始搜索蓝牙
      Future.delayed(const Duration(seconds: 2), () {
        FlutterWear().scanBluetooth();
      });
    }else{
      BotToast.showText(text: '蓝牙权限未开启,请开启蓝牙权限');
    }
  }
上一篇 下一篇

猜你喜欢

热点阅读