블루투스 권한

앱에서 블루투스 기능을 사용하려면 여러 SDK를 선언하고 권한이 있는지 확인합니다. 또한 앱에 기존 블루투스 또는 저전력 블루투스(BLE) 지원이 필요한지 지정해야 합니다. 만약 블루투스 클래식 또는 BLE가 필요하지 않지만 이러한 기능의 이점을 누릴 수 있는 경우 런타임 시 가용성을 확인할 수 있습니다.

권한 선언

앱에서 선언하는 권한 집합은 앱의 타겟에 따라 다릅니다. SDK 버전입니다.

Android 12 이상 타겟팅

참고: Android 8.0 (API 수준 26) 이상에서는 컴패니언 기기 관리도구 (CDM)는 네트워크에 연결하기 위해 권한을 이 섹션에서 설명하는 권한과 비교하여 볼 수 있습니다. 이 CDM 시스템은 앱을 대신하여 페어링 UI를 제공하며 위치 정보 액세스 권한

페어링 및 연결 환경을 더 세부적으로 관리하려면 권한을 부여할 수 있습니다.

블루투스 권한 대화상자
사용자에게 다음을 요청하는 시스템 권한 대화상자 앱에 근처를 검색, 광고, 연결할 수 있는 권한 부여 기기에서 사용할 수 있습니다.

앱이 Android 12 (API 수준 31) 이상을 타겟팅하는 경우 다음을 선언합니다. 권한을 선언하세요.

  1. 앱이 블루투스를 찾는 경우 기기(예: BLE 주변기기를 사용하려면 BLUETOOTH_SCAN 권한을 부여했는지 확인합니다.
  2. 앱에서 현재 기기를 다른 블루투스에서 검색할 수 있도록 설정하는 경우 기기 선언한 후에는 BLUETOOTH_ADVERTISE 권한을 부여했는지 확인합니다.
  3. 앱이 이미 페어링된 블루투스와 통신하는 경우 의 경우, BLUETOOTH_CONNECT 권한을 부여했는지 확인합니다.
  4. 기존 블루투스 관련 권한 선언의 경우 android:maxSdkVersion30으로 설정합니다. 이 앱 호환성 단계는 시스템에서 앱이 컴퓨터에 설치될 때 필요한 블루투스 권한만 앱에 부여 Android 12 이상을 실행하는 기기
  5. 앱에서 블루투스 검색 결과를 사용하여 실제 위치를 얻는 경우 ACCESS_FINE_LOCATION 드림 권한을 부여했는지 확인합니다. 그러지 않으면 앱이 물리적 위치.

BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT, BLUETOOTH_SCAN 권한은 런타임 권한입니다. 그러므로 사용자가 자신의 데이터를 승인해야 합니다. 블루투스 장치, 다른 장치에서 장치 검색 가능 또는 통신 블루투스 기기를 연결할 수 있습니다. 앱에서 다음 중 하나 이상을 요청하는 경우 권한이 부여되면 시스템은 사용자에게 앱이 액세스할 수 있도록 허용하라는 메시지를 표시합니다. 근처 기기(그림 1 참조)

다음 코드 스니펫은 블루투스 관련 선언 방법을 보여줍니다. 권한을 부여할 수 있습니다.

<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.
         If your app doesn't use Bluetooth scan results to derive physical
         location information, you can
         <a href="#assert-never-for-location">strongly assert that your app
         doesn't derive physical location</a>. -->
    <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" />

    <!-- Needed only if your app uses Bluetooth scan results to derive physical location. -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

앱이 물리적 위치를 얻지 않는다고 강력하게 어설션합니다

앱이 블루투스 검색 결과를 사용하여 물리적 위치를 도출하지 않는 경우 앱에서 블루투스 권한을 사용하지 않는다는 강력한 어설션을 만들 수 있음 사용하여 물리적 위치를 도출합니다. 그러려면 다음 단계를 완료하세요.

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

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

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

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

    <!-- 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. -->
    <strike><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /></strike>
    ...
</manifest>

Android 11 이하 타겟팅

앱이 Android 11(API 수준 30) 이하를 타겟팅하는 경우 앱의 매니페스트 파일에서 다음 권한을 선언합니다.

  • BLUETOOTH은(는) 필수 항목입니다. 표준 또는 BLE 통신을 수행할 수 있습니다. 연결, 연결 수락, 데이터 전송이 있습니다.
  • Android 11 이하에서는 블루투스 스캔을 사용하여 사용자 위치 정보를 수집할 수 있으므로 ACCESS_FINE_LOCATION가 필요합니다.

위치 정보 액세스 권한은 런타임 권한이므로 런타임 시 이러한 권한을 요청해야 합니다. 매니페스트에서 선언하면 됩니다

현지 블루투스 기기 찾기

앱이 기기 검색을 시작하거나 블루투스 설정을 조작하려면 BLUETOOTH_ADMIN 권한을 선언해야 합니다. 대부분의 앱은 블루투스 기기에 연결할 수 있습니다. 이 기능으로 부여된 다른 기능은 사용하지 마세요. 권한(앱이 '전원 관리자'가 아닌 경우) 블루투스 설정 수정 . 앱 매니페스트 파일에 권한을 선언합니다. 예를 들면 다음과 같습니다.

<manifest>
...
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>

앱이 서비스를 지원하고 Android 10 (API 수준 29)에서 실행할 수 있는 경우 Android 11에서는 ACCESS_BACKGROUND_LOCATION 드림 블루투스 기기를 검색할 수 있는 권한이 있어야 합니다. 이와 관련된 자세한 내용은 백그라운드에 위치합니다.

다음 코드 스니펫은 ACCESS_BACKGROUND_LOCATION를 선언하는 방법을 보여줍니다. 권한:

<manifest>
...
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
...
</manifest>

<uses-permission>를 참고하세요. 앱 권한 선언에 대한 자세한 내용은 다음 링크를 참조하세요.

블루투스 기능 사용 지정

블루투스가 앱의 핵심적인 부분인 경우 매니페스트 파일에 이 요구사항을 나타내는 플래그를 추가할 수 있습니다. 이 <uses-feature> 요소를 사용하면 앱에서 사용하는 하드웨어의 유형과 사용 여부를 지정할 수 있습니다. 필요합니다.

이 예에서는 블루투스 클래식이 기기에 필요함을 표시하는 방법을 보여줍니다. 있습니다.

<uses-feature android:name="android.hardware.bluetooth" android:required="true"/>

앱이 저전력 블루투스를 사용하는 경우 다음을 사용할 수 있습니다.

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

앱에 이 기능이 필요하다고 선언하면 Google Play 스토어에서는 이러한 기능이 없는 기기의 사용자에게 앱을 숨깁니다. 따라서 앱이 이 기능 없이 작동할 수 없는 경우에만 required 속성을 true로 설정해야 합니다.

런타임에 기능 사용 가능 여부 확인

기존 블루투스 또는 BLE를 지원하지 않는 기기에도 앱을 제공하려면 앱 매니페스트에 <uses-feature> 요소를 포함하되 required="false"로 설정해야 합니다. 그런 다음 런타임에서 기능을 사용할 수 있는지 여부를 PackageManager.hasSystemFeature():

Kotlin

// Check to see if the Bluetooth classic feature is available.
val bluetoothAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)

// Check to see if the BLE feature is available.
val bluetoothLEAvailable = packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)

Java

// Use this check to determine whether Bluetooth classic is supported on the device.
// Then you can selectively disable BLE-related features.
boolean bluetoothAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);

// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
boolean bluetoothLEAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);