(Beta 3.1 시점에서) Android 12의 Bluetooth Permission

소개



Android 12에서 Bluetooth 연결을 할 때 Permission이 조금 바뀐 것 같습니다.
내 앱이 클라이언트로 다른 BLE 장치에 연결하는 경우 Permission에 어떤 차이가 있는지 살펴 보았습니다.
시뮬레이터의 동작 베이스로 확인한 내용으로 정리합니다만, 탐험을 위해 기재에 관해서 잘못이나 지적을 받을 수 있으면 살아납니다.

기본 API의 API Level에 의한 Permission 요구의 차이




API
API 레벨 30
API 레벨 31


BluetoothAdapter.isEnabled()
BLUETOOTH
BLUETOOTH, BLUETOOTH_CONNECT

BluetoothLeScanner.startScan()
BLUETOOTH_ADMIN, ACCESS_FINE_LOCATION
BLUETOOTH_ADMIN, BLUETOOTH_CONNECT, BLUETOOTH_SCAN


  • Beta1 시점에서 API Level 30 미만(Android 12 미만)은 targetSdkVersion 30과 마찬가지로 위치 정보의 Permission이 필요.
  • API Level 30 미만에 대해서는 구의 허가가 계속 필요하므로, AndroidManifest상에서 android:maxSdkVersion="30"을 지정해 요구할 필요가 있다.

  • 코드 샘플



    BluetoothDevice를 사용할 때 위치 정보가 필요하지 않은 경우 AndroidManifest.xml에 android:usesPermissionFlags="neverForLocation"을 지정합니다.
    * Simulator를 사용할 때 usesPermissionFlags를 false로 설정하지 않으면 스캔 결과를 얻을 수 없습니다.
    *usesPermissionFlags를 false로 설정한 상태에서도 rssi 값을 얻을 수 있습니다.
    if (checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED &&
            checkSelfPermission(Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, "Permissions are already granted.", Toast.LENGTH_SHORT).show();
    } else {
        requestPermissions(new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, CHECK_PERMISSION);
    }
    

    AndroidManifest.xml
        <!-- API Level 30未満では古いPermissionを使用する -->
        <uses-permission android:name="android.permission.BLUETOOTH"
                         android:maxSdkVersion="30" />
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                         android:maxSdkVersion="30" />
        <!-- API Level 31以降で必要なPermission -->
        <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
        <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
            android:usesPermissionFlags="neverForLocation" />
    

    상기 코드로 Permission 요구했을 때에 표시되는 시스템 다이얼로그


    참고문헌



    New Bluetooth permissions in Android 12
    Bluetooth Low Energy 개요

    좋은 웹페이지 즐겨찾기