我想建立一个页面,显示我通过扫描找到的蓝牙设备。 它似乎适用于 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 的设备,我真的很感兴趣!
谢谢!