안녕하세요. 뉴핀입니다.
오늘은 지난 시간에 배운 Flutter MethodChannel을 이용하여 Android Bluetooth Permission 권한 허용을 하는 방법에 대해 알려드리고자 합니다.
Android 기기에 있는 Bluetooth를 사용하기 위해서는 Bluetooth Permission에 대한 활성화가 필요합니다.
하지만 Flutter 개발의 경우 Android 퍼미션에 대한 활성화를 하는 것이 매끄럽지 못한 경우가 한 번씩 발생합니다.
Android의 경우 Android 12 이후의 버전들에 대해서 퍼미션에 대한 활성화를 하는 방법이 조금씩 바뀌어서 불편함을 겪었는데, 오늘은 그 중 하나인 Android 12 이후의 Bluetooth 퍼미션에 대한 활성화를 하는 방법에 대해 진행해보도록 하겠습니다.
기존에 작업했던 프로젝트에서 이어서 진행하도록 하겠습니다.
우선 오늘 우리가 봐야 할 파일은 크게 4가지가 있습니다.
1) AndroidManifest.xml
2) MainActivity.kt
3) pubspec.yaml
4) main.dart
pubspec.yaml, main.dart를 제외한 1, 2번의 경우
코드 상단에 있는 Open for Editing in Android Studio 버튼을 눌러 Android 코드를 정상적으로 편집할 수 있도록 환경을 맞춰줍니다.
Flutter 코드를 작성 중인 페이지에서는 Android 코드가 인식이 안될 수 있습니다.
1. AndroidManifest.xml
android > app > src > main > AndroidManifest.xml
Bluetooth Permission에 대한 정보는 아래 링크를 통해 자세하게 확인하실 수 있습니다.
Bluetooth permissions | Android Developers
Bluetooth permissions To use Bluetooth features in your app, you must declare several permissions. You should also specify whether your app requires support for Bluetooth classic or Bluetooth Low Energy (BLE). If your app doesn't require Bluetooth classic
developer.android.com
우선 AndroidManifest 파일 내에 있는 <manifest> 와 <application> 사이에 아래 코드를 삽입합니다.
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<!-- Needed only if your app looks for Bluetooth devices.
You must add an attribute to this permission, or declare the
ACCESS_FINE_LOCATION permission, depending on the results when you
check location usage in your app. -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- Needed only if your app makes the device discoverable to Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<!-- Needed only if your app communicates with already-paired Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
저전력 블루투스(BLE) 검색 의 경우 android.permission.BLUETOOTH_SCAN에 대한 권한이 필요합니다.
현재 기기를 다른 블루투스 기기에서 검색할 수 있도록 하기 위해 android.permission.BLUETOOTH_ADVERTISE에 대한 권한이 필요합니다.
이미 페어링 된 블루투스 기기와 통신하기 위해 android.permission.BLUETOOTH_CONNECT에 대한 권한이 필요합니다.
SDK Version이 30 이하인 기기의 경우 상단에 있는 두 개의 퍼미션으로 블루투스 권한 설정이 가능했습니다. 하지만 우리는 Android 12 이상의 기기에서 블루투스 권한을 설정하기 위해 상단에 있는 두 개의 퍼미션은 maxSdkVersion="30"으로 세팅 후 아래에 있는 퍼미션까지 작성합니다.
이번 시간에는 블루투스 권한 허용까지만 하고, 다음 시간에 블루투스 검색 및 연결에 대해 알아보도록 하겠습니다.
2. MainActivity.kt
android > app > src > main > kotlin > MainActivity
MainActivity에서 아래 코드를 삽입합니다.
기존에 작성했던 코드에서 일부 수정되었습니다.
private val CHANNEL = "example.com/value"
@RequiresApi(Build.VERSION_CODES.M)
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result ->
if(call.method == "getBle") {
if(this.checkSelfPermission(Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) {
requestBlePermissions()
}
result.success("success")
} else {
result.notImplemented()
}
}
}
private var PERMISSION_REQUEST_CODE = 1
private var PERMISSION_REQUEST_CODE_S = 2
@RequiresApi(Build.VERSION_CODES.M)
private fun requestBlePermissions() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
requestPermissions(
arrayOf(
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.ACCESS_FINE_LOCATION
),PERMISSION_REQUEST_CODE_S)
}
else {
requestPermissions(
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
PERMISSION_REQUEST_CODE)
}
}
main.dart에서 메소드를 호출할 때 "getBle"로 통신을 하며 android.permission.BLUETOOTH_SCAN에 대한 퍼미션을 확인 후 설정이 되어있지 않으면 requestBlePermissions 함수를 통해 SDK Version을 확인 후 각 버전에 따른 설정에 맞게 권한을 허용합니다.
3. pubspec.yaml
dependencies 단에 flutter_blue를 버전에 맞게 작성합니다.
flutter_blue는 Flutter에서 Bluetooth를 사용하기 위한 패키지입니다.
플러터 패키지인 flutter_blue에 대한 정보는 아래 링크를 통해 자세하게 확인하실 수 있습니다.
flutter_blue | Flutter Package
Flutter plugin for connecting and communicating with Bluetooth Low Energy devices, on Android and iOS
pub.dev
해당 코드를 올바르게 작성하였다면 상단에 있는 Pub get을 클릭 후 main.dart로 넘어갑니다.
4. main.dart
lib > main.dart
main.dart 중 State 단에 아래 코드를 삽입합니다.
퍼미션 허용을 확인하기 위해 UI 부분은 최소화하였습니다.
FlutterBlue flutterBlue = FlutterBlue.instance;
List<ScanResult> scanResultList = [];
static const platform = MethodChannel('example.com/value');
Future<void> _getNativeValue() async {
String value;
try {
value = await platform.invokeMethod('getBle');
} on PlatformException catch (e) {
value = 'native code error: ${e.message}';
}
setState(() {});
}
@override
void initState() {
super.initState();
initBle();
}
void initBle() async {
await _getNativeValue();
flutterBlue.isScanning.listen((isScanning) {
setState(() {});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Text('success')
),
);
}
메소드 채널과 통신할 value 값을 입력해주고, initBle 비동기 함수를 통해 블루투스를 사용하도록 합니다.
블루투스를 사용하게 되면 자연스럽게 권한을 얻는 메시지를 보냅니다.
SDK Version 30 이하의 기존 버전과 다른 점은 위치 허용 시 설정하는 방법이 달라졌습니다. 위치 허용을 받고, 블루투스 권한에 대한 허용을 받게 되면 해당 기기에서 블루투스 연결이 가능해집니다.
이렇게 Flutter에서 MethodChannel을 통해 Android 기기의 Bluetooth Permission을 허용하는 과정까지 완료하였습니다.
다음 시간에는 이 Bluetooth Permission을 통해 Android 12 이상의 기기에서 주변 블루투스 기기를 찾는 것에 대해 알아보도록 하겠습니다.
감사합니다.
'Programming > APP' 카테고리의 다른 글
Flutter MethodChannel 연동 (3) - Android Bluetooth 기기 찾기 (0) | 2022.10.05 |
---|---|
SwiftUI로 IOS 개발하기(3) - StackView (0) | 2022.09.16 |
SwiftUI로 IOS 개발하기(2) - 프로젝트 기초 (0) | 2022.08.29 |
Flutter MethodChannel 연동 (1) - Android (0) | 2022.08.22 |
SwiftUI로 IOS 개발하기(1) - 입문, 프로젝트 생성 (0) | 2022.08.01 |
댓글