이제 Android 13 개발자 프리뷰를 사용할 수 있습니다. 지금 사용해 보시고 의견을 알려 주세요.

Android 12의 새 블루투스 권한

Android 12에서는 BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT 권한을 도입합니다. 이를 통해 앱이 위치 정보 액세스 권한을 요청하지 않고도 근처 기기를 검색할 수 있습니다. 이러한 권한을 선언하려면 앱이 Android 12를 타겟팅해야 합니다.

페어링 및 연결 환경을 세밀하게 제어하려면 이 페이지에 설명된 권한을 사용하세요.

새 권한 선언

앱이 블루투스 기기와 상호작용한다면 다음을 실행하는 것이 좋습니다.

  1. 앱이 저전력 블루투스(BLE) 주변기기와 같은 블루투스 기기를 검색하는 경우 BLUETOOTH_SCAN 권한을 앱 매니페스트에 추가합니다.
  2. 앱이 현재 기기를 다른 블루투스 기기에서 검색할 수 있도록 하려는 경우 BLUETOOTH_ADVERTISE 권한을 앱 매니페스트에 추가합니다.
  3. 앱이 이미 페어링된 블루투스 기기와 통신한다면 BLUETOOTH_CONNECT 권한을 앱 매니페스트에 추가합니다.
  4. 기존 블루투스 관련 권한 선언의 경우 android:maxSdkVersion30으로 설정합니다. 이 앱 호환성 단계를 통해 시스템은 Android 12를 실행하는 기기에 설치할 때 필요한 블루투스 권한만 앱에 부여할 수 있습니다.

다음 코드 스니펫은 앱에서 이러한 새 권한을 선언하는 방법을 보여줍니다.

<manifest>
    <!-- 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" />
    ...
</manifest>
그림 1. 사용자에게 근처 기기를 검색하고 광고하며 연결하는 권한을 앱에 부여하라고 요청하는 시스템 권한 대화상자

사용자에게 표시되는 대화상자

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

앱이 새 블루투스 권한 중 하나 이상을 요청하면 시스템은 그림 1과 같이 앱이 근처 기기에 액세스하도록 허용하라는 메시지를 사용자에게 표시합니다.

검색 결과 사용 방법 고려

앱이 블루투스 검색 결과를 사용하여 기기 위치를 파생하는지 신중하게 고려하세요. 답변에 따라 다음 섹션 중 하나의 단계를 완료합니다.

앱이 실제 위치를 파생하지 않음

앱이 실제 위치를 파생하지 않으면 앱이 블루투스 권한을 사용하여 실제 위치를 파생하지 않는다는 강력한 어설션을 만들 수 있습니다. 그러려면 다음 단계를 완료하세요.

  1. android:usesPermissionFlags 속성을 BLUETOOTH_SCAN 권한 선언에 추가하고 이 속성 값을 neverForLocation으로 설정합니다.

  2. 위치가 앱에 달리 필요하지 않으면 앱의 매니페스트에서 ACCESS_FINE_LOCATION 권한을 삭제합니다.

다음 코드 스니펫은 앱의 매니페스트 파일을 업데이트하는 방법을 보여줍니다.

<manifest>
    <!-- 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" />

    <!-- Include "neverForLocation" only if you can strongly assert that
         your app never derives physical location from Bluetooth scan results. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                     android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- Not needed if you can strongly assert that your app never derives
         physical location from Bluetooth scan results and doesn't need location
         access for any other purpose. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

앱이 실제 위치를 파생함

앱이 실제 위치를 파생하면 다음 코드 스니펫과 같이 앱의 매니페스트에서 ACCESS_FINE_LOCATION 권한을 계속 선언해야 합니다.

<manifest>
    <!-- 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" />

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- Required if your app derives physical location from Bluetooth
         scan results. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>