蓝牙设备不支持 API 31 及以上,但在 Flutter 中适用于 30

问题描述 投票:0回答:0

我想建立一个页面,显示我通过扫描找到的蓝牙设备。 它似乎适用于 android API 30,因为出现了两个设备(模拟器上的 gBeacon),但相同的代码没有找到 API >= 31 的任何设备。

我已经在 manifest.xml 中添加了权限:

<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission 
        android:name="android.permission.BLUETOOTH_SCAN" 
        android:usesPermissionFlags= "neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

没有发现错误,设备只是没有出现。 在调试时,我发现这不是打印问题,因为我的设备列表对于 API >=31 保持为空。

这是我的代码:

class ChooseDevicePage extends StatelessWidget {
  ChooseDevicePage({super.key});
  final List<BluetoothDevice> devicesList = <BluetoothDevice>[];
  final FlutterBlue flutterBlue = FlutterBlue.instance;

  @override
  Widget build(BuildContext context){
    //... call of
        child: MainWidget( chooseDevicePage: this,),
   // some other widget
  }
}

class MainWidget extends StatefulWidget {
  final ChooseDevicePage chooseDevicePage;
  const MainWidget({super.key, required this.chooseDevicePage});
  
  @override
  State<MainWidget> createState() => _MainWidgetState();
}

class _MainWidgetState extends State<MainWidget> {
  late ChooseDevicePage page;
  List<String> devices = [];

  @override
  initState() {
    page = widget.chooseDevicePage;
    loadBluetoothList();
    page.flutterBlue.startScan();
    super.initState();  
  }

  @override
  Widget build(BuildContext context) {
    backgroundTimer(context);
    return FutureBuilder(
      future: areEnabled(),
      builder:(context, snapshot) {
        if(snapshot.connectionState == ConnectionState.done){
          if(snapshot.hasError){
            return Center(
              child: Text('${snapshot.error} occured', style: const TextStyle(fontSize: 18)),
            );
          }else if(snapshot.hasData){
            final data = snapshot.data as List<bool>;
            if(!data.every((element) => element == true)){
              Permission.bluetoothConnect.request();
              Permission.bluetoothScan.request();
              return ErrorBluetoothWidget(text: 'Please enable Bluetooth');
            } else{
              return printDeviceList();
            }
          }
        }
        return const Center(
          child: CircularProgressIndicator(),
        );
      },
    );
  }

 Future<List<bool>> areEnabled() async{
    return Future.wait([
    Permission.bluetoothScan.isGranted, 
    Permission.bluetoothConnect.isGranted, 
    page.flutterBlue.isOn
    ]);
  }

void loadBluetoothList() async {
    //listen for the device that are already connected
    page.flutterBlue.connectedDevices
        .asStream()
        .listen((List<BluetoothDevice> devices) {
      for (BluetoothDevice device in devices) {
        _addDeviceToList(device);
      }
    });
    //listen for the device that are not connected but accessible
    page.flutterBlue.scanResults.listen((List<ScanResult> results) {
      for (ScanResult result in results) {
        _addDeviceToList(result.device);
      }
    });

void _addDeviceToList(final BluetoothDevice device) {
    if (!page.devicesList.contains(device)) {
      setState(() {
        page.devicesList.add(device);
      });
    }
  }

  backgroundTimer(BuildContext context){
   Timer.periodic(const Duration(seconds: 5), (timer) => loadBluetoothList());
  } 
}

我知道权限:

Permission.bluetoothScan.isGranted, 
Permission.bluetoothConnect.isGranted, 
page.flutterBlue.isOn

真的被授予(使用调试分析器)。

如果有人可以帮助我或者知道为什么找不到 API >=31 的设备,我真的很感兴趣!

谢谢!

flutter bluetooth android-permissions android-bluetooth android-api-levels
© www.soinside.com 2019 - 2024. All rights reserved.