final flutterReactiveBle = FlutterReactiveBle(); //flutter_reactive_ble 라이브러리 초기화
List<DiscoveredDevice> _foundBleUARTDevices = []; //검색된 BLE_UART장치 List를 저장
bool _scanning = false; //SCAN 작업 진행 상태 저장
bool _connected = false; //연결 상태 저장
pubspec.yaml 파일을 열고 아래와 같이 permission_handler 값을 지정한 후
터미널에서 flutter pub get을 실행해 준다.
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
flutter_reactive_ble: ^5.0.2
permission_handler: ^10.0.0
PS C:\Users\eangg\Desktop\Project\flutterproject\bleTest> flutter pub get
Running "flutter pub get" in bleTest... 2,424ms
PS C:\Users\eangg\Desktop\Project\flutterproject\bleTest>
2.AndroidManifest.xml 파일 수정
android/app/src/main/AndroidManifest.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_CONNECT" />
<!-- Android 12 이상에서는 BLE에서 위치 정보를 사용하지 않을 경우
ACCESS_FINE_LOCATION을 추가하지 않아도 되지만 하위 호환성을 위해 추가한다.-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.ble_example"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
//minSdkVersion flutter.minSdkVersion
minSdkVersion 21
Future<bool> checkIfPermissionGranted() async {
Map<Permission, PermissionStatus> statuses = await[
// 위치 권한 허용 (Android 12 이상에서는 BLE에서 위치 정보를 사용하지 않을 경우
// location을 추가하지 않고 bluetoothScan만 있으면 되지만 하위 호환성을 위해
// 추가한다.
Permission.location,
Permission.bluetoothScan, // Android 12이상부터 추가된 근처 기기 접근 권한 허용
].request();
bool permitted = true;
statuses.forEach((permission, permissionStatus) {
if (!permissionStatus.isGranted)
permitted = false;
});
return permitted;
}
RxJavaPlugins.setErrorHandler { throwable ->
if (throwable is UndeliverableException && throwable.cause is BleException) {
return@setErrorHandler // ignore BleExceptions since we do not have subscriber
}
else {
throw throwable
}
}
(2) Which Permissions are needed?
- Android
Android의 경우 라이브러리는 다음 권한을 사용한다.
ACCESS_FINE_LOCATION : 오래된 Nexus 기기가 안정적인 스캔 결과를 제공하기 위해 위치 서비스가 필요하기 때문에 이 권한이 필요하다.