근처 Wi-Fi 기기의 새 런타임 권한

Android 13(API 수준 33)에서는 Wi-Fi를 통해 근처 액세스 포인트로의 기기 연결을 관리하는 앱을 위해 NEARBY_DEVICES 권한 그룹에 속하는 NEARBY_WIFI_DEVICES 런타임 권한이 도입되었습니다. 이 권한을 사용하면 앱의 근처 Wi-Fi 기기 액세스를 더 쉽게 지원할 수 있습니다. 이전 버전의 Android에서는 이러한 앱이 대신 ACCESS_FINE_LOCATION 권한을 선언해야 했습니다.

앱이 Android 13을 타겟팅하고 여러 다양한 Wi-Fi API를 호출하는 경우 이 새로운 권한을 사용자로부터 얻어야 합니다.

영향을 받는 사용 사례

새로운 권한이 영향을 미치는 여러 다양한 Wi-Fi 사용 사례에는 다음이 포함됩니다.

  • 프린터나 미디어 전송 기기와 같은 근처 기기를 찾거나 기기에 연결합니다. 이 워크플로를 통해 앱은 다음과 같은 작업을 할 수 있습니다.
    • BLE 등을 통해 대역 외 AP 정보를 수신합니다.
    • 로컬 전용 핫스팟을 사용하는 Wi-Fi Aware 및 Connect를 통해 기기를 검색하여 연결합니다.
    • Wi-Fi Direct를 통해 기기를 검색하여 연결합니다.
  • 자동차나 스마트 홈 기기와 같이 알려진 SSID에 연결을 시작합니다.
  • 로컬 전용 핫스팟을 시작합니다.
  • 근처 Wi-Fi Aware 기기까지 다양한 기기를 지원합니다.

권한은 근처 기기 그룹에 속해 있습니다

NEARBY_WIFI_DEVICES 권한은 근처 기기 권한 그룹의 일부입니다. Android 12(API 수준 31)에서 추가된 이 그룹에는 블루투스와 초광대역 관련 권한도 포함되어 있습니다. 앱이 이 권한 그룹의 여러 권한을 요청하면 사용자에게 단일 런타임 대화상자가 표시되어 앱의 근처 기기 액세스를 승인하도록 사용자에게 요청합니다. 시스템 설정에서 사용자는 근처 기기 권한을 그룹으로 사용 설정하거나 사용 중지해야 합니다. 예를 들어 사용자는 Wi-Fi 액세스를 사용 중지할 수 없지만 특정 앱에 블루투스 액세스는 사용 설정된 상태로 유지할 수 있습니다.

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

Android 13을 타겟팅할 때 앱이 Wi-Fi API에서 위치 정보를 얻는지 고려합니다. 그렇지 않다면 이를 강력하게 어설션해야 합니다. 이 어설션을 만들려면 다음 코드 스니펫과 같이 앱의 매니페스트 파일에서 usesPermissionFlags 속성을 neverForLocation으로 설정합니다. 이 프로세스는 블루투스 기기 정보가 위치에 사용되지 않는다고 어설션할 때 실행하는 프로세스와 유사합니다.

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />
    <application ...>
        ...
    </application>
</manifest>

이전 버전과의 호환성 유지

NEARBY_WIFI_DEVICES 권한은 Android 13 이상에서만 사용할 수 있으므로 앱에서 이전 버전과의 호환성을 제공하려면 모든 ACCESS_FINE_LOCATION 선언을 유지해야 합니다. 그러나 앱이 Wi-Fi API를 사용하여 물리적 위치를 얻지 않는다고 강력하게 어설션하는 한 다음 코드 스니펫과 같이 이 권한의 최대 SDK 버전을 32로 설정할 수 있습니다.

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

일부 API에는 여전히 위치 정보 액세스 권한이 필요합니다

일부 Wi-Fi API는 12L 이하에서와 마찬가지로 액세스하려면 계속 ACCESS_FINE_LOCATION 권한이 필요합니다. WifiManager 클래스의 다음 메서드가 예에 포함되어 있습니다.

새 권한이 필요한 API 확인

앱이 Android 13 이상을 타겟팅한다면 NEARBY_WIFI_DEVICES 권한을 선언하여 다음 Wi-Fi API를 호출해야 합니다.

Wi-Fi 액세스 워크플로

그림 1은 12L 이하를 실행하는 기기의 Wi-Fi 액세스 워크플로를 보여줍니다. ACCESS_FINE_LOCATION 권한 의존도를 확인합니다.

그림 1. 12L 이하를 타겟팅하는 앱이 Wi-Fi 정보에 액세스할 수 있는지 판단하는 플로 차트

그림 2는 Android 13 이상을 타겟팅하는 앱의 경우 Android 13 이상을 실행하는 기기의 Wi-Fi 액세스 워크플로를 보여줍니다. 앱이 Wi-Fi 기기 정보에서 물리적 위치를 얻지 않는다고 어설션하는 한 ACCESS_FINE_LOCATION 권한을 더 이상 선언할 필요가 없습니다.

그림 2. Android 13 이상을 타겟팅하는 앱이 Wi-Fi 정보에 액세스할 수 있는지 판단하는 플로 차트