회사에서 ble 연결을 통해 데이터를 주고받는 앱을 수정하는데 알 수 없는 버그가 발견되었다.
고객사 측에서는 ble연결 후에 앱 안에서의 음원이 자꾸 끊긴다는 이야기였다.
도통 무슨 소리인지 알 수가 없어서 이해가 안됐는데 안드로이드 공식문서를 보다가 실마리를 찾았다.
안드로이드 12가 나오면서 블루투스 권한이 변경되었다는 것이다.
https://developer.android.com/guide/topics/connectivity/bluetooth/permissions
지금부터 설명할 내용은 위 안드로이드 공식문서를 바탕으로 작성되었다.
1. Android 12 블루투스 권한
앱이 Android 12 (API level 31)이상을 타겟한다면 매니페스트 파일에 아래 권한 3개를 추가해주어야한다.
안드로이드 11 이하에서 블루투스 권한을 선언했을 때 필요한
은 선언시에 android:maxSdkVersion="30" 를 붙여준다.
스캔시에 장치의 물리적 위치를 가져오고싶다면 ACCESS_FINE_LOCATION
을 선언해주면 된다.
<!-- 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"/>
<!--android 12 new bluetooth permission-->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
위의 코드가 Android12에서 최종적인 manifest파일에서의 블루투스 권한 선언 내용이다.
이제, 런타임시에 BLUETOOTH_CONNECT, BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE 권한을 요청해주면 된다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT
),
Constants.Permission.REQ_CODE_BLE
)
}
이런식으로 요청해주면 된다.
원래는 권한이 거부상태이면, 요청하는게 맞지만 지금은 연습하는 과정이기때문에 생략한다.