반응형
Android 12에서는 BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT 권한을 도입합니다. 이를 통해 앱이 위치 정보 액세스 권한을 요청하지 않고도 근처 기기를 검색할 수 있습니다. 이러한 권한을 선언하려면 앱이 Android 12를 타겟팅해야 합니다.
새 권한 선언
앱이 블루투스 기기와 상호작용한다면 다음을 실행하는 것이 좋습니다.
- 앱이 저전력 블루투스(BLE) 주변기기와 같은 블루투스 기기를 검색하는 경우 BLUETOOTH_SCAN 권한을 앱 매니페스트에 추가합니다.
- 앱이 현재 기기를 다른 블루투스 기기에서 검색할 수 있도록 하려는 경우 BLUETOOTH_ADVERTISE 권한을 앱 매니페스트에 추가합니다.
- 앱이 이미 페어링된 블루투스 기기와 통신한다면 BLUETOOTH_CONNECT 권한을 앱 매니페스트에 추가합니다.
- 기존 블루투스 관련 권한 선언의 경우 android:maxSdkVersion을 30으로 설정합니다. 이 앱 호환성 단계를 통해 시스템은 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" />
<!-- 앱에서 블루투스 장치를 찾는 경우에만 필요
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" />
<!-- 블루투스 장치에서 장치를 검색할 수 있도록 앱이 설정한 경우에만 필요 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<!-- 앱이 이미 페어링된 블루투스 장치와 통신하는 경우에만 필요 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
...
</manifest>
그리고 위에 추가한 권한을 사용자에게 요청하는 코드도 추가한다
앱 권한 요청하는방법 : https://developer.android.com/training/permissions/requesting?hl=ko
앱이 실제 위치를 파생하지 않음
앱이 실제 위치를 파생하지 않으면 앱이 블루투스 권한을 사용하여 실제 위치를 파생하지 않는다는 강력한 어설션을 만들 수 있습니다. 그러려면 다음 단계를 완료하세요.
- android:usesPermissionFlags 속성을 BLUETOOTH_SCAN 권한 선언에 추가하고 이 속성 값을 neverForLocation으로 설정합니다.
- 위치가 앱에 달리 필요하지 않으면 앱의 매니페스트에서 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>
앱이 실제 위치를 파생할 경우 ( 실제로 위치도 사용할 경우에는 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>
실제로 앱에서는 이렇게 사용하고 있다. 블루투스 스캔도 잘 되고 연결도 잘 된다
( 안드로이드 버전 12, 9 에서 모두 확인)
<!-- 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_CONNECT" />
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
반응형
'Android' 카테고리의 다른 글
Android Retrofit2을 이용한 로그인 example (0) | 2022.06.16 |
---|---|
TextView 특정 글자만 색상/크기 변경하기 (0) | 2022.05.31 |
EditTextView에서 자동으로 폰번호 - 넣기 (0) | 2022.05.13 |
Bitbucket에서 갑자기 Git pull push 안될때 !!! (0) | 2022.05.13 |
ConstraintLayout 버튼 Front 적용이 안될때 | bringtoFront 안될때 (0) | 2022.05.13 |
댓글