https://pub.dev/packages/flutter_bluetooth_serial

 

flutter_bluetooth_serial | Flutter package

A basic Flutter Bluetooth Serial library

pub.dev

 

 

FlutterBluetoothSerial 패키지를 활용해서 블루투스 끄기/켜기 제어하는 기능을 넣었는데,

await FlutterBluetoothSerial.instance.requestDisable();

 

이렇게 끄는 기능에 한해서만 제대로 작동이 안됨. 
해당 패키지가 업데이트가 마지막으로 된 것도 3년전이기도한데, 

이유를 찾아보니 안드로이드의 보안 정책상 안드로이드 11 이상부터는 끄기에 대한 기능 제한을 두게 됐다고 함.

git issue를 봐도 나와있음
https://github.com/edufolly/flutter_bluetooth_serial/issues?q=is%3Aissue%20state%3Aopen%20requestDisable

 

그래서 안드로이드 SDK 버전을 활용해서 아래와 같은 형식으로 제어하도록 했다. 

   if (sdkVersion >= 30) {
          // 다이얼로그로 직접 제어하는 것을 안내 
	} else {
            await FlutterBluetoothSerial.instance.requestDisable();
	}

 

더보기

Flutter에서 FlutterBluetoothSerial.instance.requestEnable()을 통해 블루투스 활성화를 요청하는 것은 잘 작동하지만, 블루투스를 끄는(비활성화하는) 기능은 안드로이드 정책상 직접적으로 앱에서 요청하기 어렵습니다.

몇 가지 이유와 관련 문제점을 설명해 드릴게요.

1. 안드로이드 보안 및 사용자 경험 정책

  • 블루투스 활성화는 허용: 안드로이드 시스템은 사용자의 명시적인 동의를 얻어 앱이 블루투스를 켜도록 요청하는 것을 허용합니다. 이는 앱이 기능을 사용하기 위해 블루투스가 필요함을 사용자에게 알리고, 사용자가 편리하게 활성화할 수 있도록 돕기 위함입니다. requestEnable()이 바로 이 역할을 합니다. 사용자가 동의 다이얼로그에서 '예'를 누르면 블루투스가 켜집니다.
  • 블루투스 비활성화는 제한: 반면, 앱이 사용자의 명시적인 동의 없이 블루투스를 비활성화하는 것은 보안 및 사용자 경험 측면에서 엄격하게 제한됩니다.
    • 보안: 악의적인 앱이 사용자의 동의 없이 블루투스를 끄면, 연결된 다른 기기(예: 스마트워치, 이어폰, 자동차 인포테인먼트)와의 연결을 끊어버릴 수 있습니다. 이는 사용자의 기기 사용에 큰 불편을 초래하거나 보안 문제를 야기할 수 있습니다.
    • 사용자 경험: 사용자가 특정 이유로 블루투스를 켜 둔 상태인데, 앱이 임의로 꺼 버리면 사용자는 혼란을 겪고 다시 켜야 하는 번거로움이 생깁니다.

2. Android API 레벨에 따른 변경 사항

  • 과거 Android 버전 (API 레벨 29 이하): 과거에는 BluetoothAdapter.disable()과 같은 API를 사용하여 앱에서 직접 블루투스를 비활성화할 수 있었습니다. 하지만 이는 BLUETOOTH_ADMIN 권한이 필요했고, 위에서 언급한 보안 및 사용자 경험 문제 때문에 점차 제한되기 시작했습니다.
  • 현재 Android 버전 (API 레벨 30 이상): Android 11 (API 레벨 30)부터는 BluetoothAdapter.disable() API가 더 이상 앱에서 호출될 수 없습니다. 즉, 앱이 직접 블루투스를 비활성화할 수 있는 방법이 사라졌습니다.
    • 이러한 변경 사항은 개발자가 사용자 경험을 존중하고, 시스템 설정을 통해 블루투스 상태를 사용자가 직접 제어하도록 유도하기 위한 구글의 정책적인 결정입니다.

3. FlutterBluetoothSerial 플러그인의 한계

FlutterBluetoothSerial 플러그인은 기본적으로 안드로이드 플랫폼의 블루투스 API를 래핑(wrapping)하여 제공합니다. 따라서 안드로이드 OS 자체에서 블루투스 비활성화 기능을 앱에 제공하지 않으므로, 이 플러그인 또한 해당 기능을 제공할 수 없습니다. requestEnable()과 같은 메서드는 안드로이드에서 허용하는 블루투스 상태 변경 요청(활성화)을 래핑한 것입니다.

결론 및 대안

Flutter 앱에서 requestEnable()로 블루투스를 활성화하는 것은 가능하지만, requestDisable()과 같이 블루투스를 직접 끄는(비활성화하는) 기능은 안드로이드의 보안 및 사용자 경험 정책 때문에 공식적으로 제공되지 않으며, 현재 안드로이드 API 레벨 30 이상에서는 앱에서 직접 호출할 수 없습니다.

 

 

복사했습니다!