我正在开发一个使用 Flutter 通过蓝牙与 OBD-II 扫描仪连接的应用程序。我尝试过 Flutter Blue 包和其他一些包,但它们没有向我显示任何可用的蓝牙设备(没有扫描结果),调试控制台内也没有任何错误消息。连接扫描仪后,我必须读取数据流。请指导我。这是代码
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final title = 'Flutter BLE Scan Demo';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: title,
home: MyHomePage(title: title),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, @required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
FlutterBlue flutterBlue = FlutterBlue.instance;
List<ScanResult> scanResultList = [];
bool _isScanning = false;
@override
initState() {
super.initState();
initBle();
}
void initBle() {
flutterBlue.isScanning.listen((isScanning) {
_isScanning = isScanning;
setState(() {});
});
}
scan() async {
if (!_isScanning) {
scanResultList.clear();
flutterBlue.startScan(timeout: Duration(seconds: 4));
flutterBlue.scanResults.listen((results) {
scanResultList = results;
setState(() {});
});
} else {
flutterBlue.stopScan();
}
}
Widget deviceSignal(ScanResult r) {
return Text(r.rssi.toString());
}
Widget deviceMacAddress(ScanResult r) {
return Text(r.device.id.id);
}
Widget deviceName(ScanResult r) {
String name = '';
if (r.device.name.isNotEmpty) {
name = r.device.name;
} else if (r.advertisementData.localName.isNotEmpty) {
name = r.advertisementData.localName;
} else {
name = 'N/A';
}
return Text(name);
}
Widget leading(ScanResult r) {
return CircleAvatar(
child: Icon(
Icons.bluetooth,
color: Colors.white,
),
backgroundColor: Colors.cyan,
);
}
void onTap(ScanResult r) {
print('${r.device.name}');
}
Widget listItem(ScanResult r) {
return ListTile(
onTap: () => onTap(r),
leading: leading(r),
title: deviceName(r),
subtitle: deviceMacAddress(r),
trailing: deviceSignal(r),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: ListView.separated(
itemCount: scanResultList.length,
itemBuilder: (context, index) {
return listItem(scanResultList[index]);
},
separatorBuilder: (BuildContext context, int index) {
return Divider();
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: scan,
child: Icon(_isScanning ? Icons.stop : Icons.search),
),
);
}
}
以下是权限:
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
提前致谢
你在 AndroidManifest 中尝试过这个吗:
<!-- New Bluetooth permissions in Android 12
https://developer.android.com/about/versions/12/features/bluetooth-permissions -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- legacy for Android 11 or lower -->
<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.ACCESS_FINE_LOCATION" android:maxSdkVersion="30"/>
<!-- legacy for Android 9 or lower -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />