iSyncWave앱은 Bluetooth Low Energy(BLE)를 이용해 WAVE기기와 연동하여 뇌파 신호를 그려주는 기능을 가지고 있습니다. Android 12로 소프트웨어 업데이트 후 블루투스 권한에 추가 권한이 필요하여 앱이 강제종료되는 이슈가 있었습니다.

Android 12의 새 블루투스 권한

Android 12에서는 BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT 권한이 필요합니다. 위 권한을 체크하기 위해서 아래 내용을 참고했습니다.

Android 12 타겟팅

필요한 권한들은 Android 12 타겟팅을 필수로 해야 import 가능하다.

android{
   compileSdkVersion 31
	 ...
	 defaultConfig {
		 ...
		 targetSdkVersion 31
		 ...
		 }
}

AndroidManifest.xml에 Intent Filter, Service, Broadcast receiver를 포함한 앱 구성요소에 android:exported속성을 필수적으로 선언해야 한다.

새 권한 선언

  1. 앱 이 BLE 주변기기와 같은 블루투스 기기를 찾는 경우 BLUETOOTH_SCAN 권한을 선언합니다.
  2. 앱이 저전력 블루투스(BLE) 주변기기와 같은 블루투스 기기를 검색하는 경우 BLUETOOTH_SCAN권한을 앱 매니페스트에 추가합니다.
  3. 앱이 현재 기기를 다른 블루투스 기기에서 검색할 수 있도록 하려는 경우 BLUETOOTH_ADVERTISE 권한을 앱 매니페스트에 추가합니다.
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

기존 블루투스 관련 권한 선언의 경우 android:maxSdkVersion을 30으로 설정합니다. 이 앱 호환성 단계를 통해 시스템은 Android 12를 실행하는 기기에 설치할 때 필요한 블루투스 권한만 앱에 부여할 수 있습니다.

<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.ACCESS_FINE_LOCATION" />

런타임 권한 선언

BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT 권한은 런타임 권한입니다. 따라서 명시적으로 앱에서 사용자 승인을 요청해야 블루투스 기기를 찾거나 기기를 다른 기기에서 검색할 수 있게 하거나 이미 페어링된 블루투스 기기와 통신할 수 있습니다.

어떻게 우리 프로젝트에 사용 가능할까?

현재 BLE 기기를 스캔 후 연결까지의 시나리오는 UUID filter를 거쳐 BLE 기기 스캔하여 나오는 리스트 중 나의 기기를 선택해서 연결하는 방식입니다.

언급되었던 의견 중에 자동 연결에 대한 요구가 있었던 것을 생각해보면 현재 시리얼 넘버를 등록하여 아이디 당 1기기 연결만 가능하도록 기획이 나와 있는데 디바이스 기기를 스캔하지 않고도 시리얼 넘버를 이용해 자동 연결하거나 데모나 영업적으로 사용할 때는 UUID Filter와 위치정보를 이용해 가까이 있는 기기를 자동 연결하는 기능이 추가 구현될 수 있을 것 같습니다.

마치며

현재 12 업데이트 내용 중 우리 프로젝트에 영향을 미칠 수 있는 부분에 대해서 적용하고 있습니다. Android OS 업데이트나 Google Play 프로그램 정책 사항에 변동이 일어나는 것에 당황하지 않고 발 빠르게 대처하는 신속함이 필요할 것 같습니다.

최근 구글 I/O에서 Jetpack Compose라는 선언형 UI가 공개되었는데 태블릿/안드로이드를 지원하는 iSyncMe 앱에서 유용하게 쓰일 수 있을 것 같아서 장/단점을 검토해보겠습니다.