핀수로그
  • Android 12에서 블루투스 기기 검색이 되지 않는 문제 | startDiscovering is not working on Android 12
    2022년 11월 13일 17시 15분 23초에 업로드 된 글입니다.
    작성자: 핀수
    728x90
    반응형

    문제 상황

    앱을 개발하고 테스트를 진행한 후, 문제가 없다고 판단하고 스토어에 배포를 했다.

    본가에 가서 엄마 폰으로 내 앱을 다운 받아 실행해 보았다.

    ??

    검색이 안된다.

    블루투스 페어링하는 앱인데 기기 검색이 안되면 이걸 누가 쓰나

    내 폰에서는 잘 됐는데..!! 설마 이거 또 OS 문제인가

    엄마에게 양해를 구하고 디버깅을 실행했다.

    울 엄마가 사용하는 기종은 노트 텐 플러스 OS 버전 12 되시겠다.

     

     

    startDiscovery()를 실행 했을 때의 로그는 아래와 같았다.

    먼저 내 개발용 디바이스인 갤럭시 진

     

    OS 10

    D/BluetoothAdapter: startDiscovery
    D/NonPairedFragment: onReceive: android.bluetooth.adapter.action.DISCOVERY_STARTED 
    D/NonPairedFragment: onReceive: android.bluetooth.device.action.FOUND

    그리고 OS 12

    I/BluetoothAdapter: startDiscovery

    ?? 로그는 찍히는데..

    해당 메소드는 성공하면 true를, 그렇지 않으면 false를 반환한다.

    찍어보았는데 아니나다를까 false를 리턴하고 있었다.

    그러니까 리시버도 어떠한 알림을 받을 수 없었겠지

    도대체 뭐가 문제란 말인가?

    알다시피 블루투스 권한은 OS12에서 변경되었다.

    이것과 관련이 있단말인가?

    구글 이놈들 도대체 12에서 무슨짓을 하고 있는것인가?

     

     

    내 앱의 권한 상태는 다음과 같았다.

    AndroidManifast.xml

      <uses-permission android:name="android.permission.BLUETOOTH" />
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
            android:maxSdkVersion="30"/>
        <uses-permission
            android:name="android.permission.ACCESS_FINE_LOCATION"
            android:usesPermissionFlags="neverForLocation"
            tools:targetApi="s"
            android:maxSdkVersion="30"/>
    
        <!--  android 12+  -->
        <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
        <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

    위의 권한에 대해 짚고 넘어가자면

    안드로이드 버전 10부터 블루투스 기기를 검색하기 위해서는 위치 권한을 명시적으로 부여 받아야 했다.

     

    ACCESS_COARSE_LOCATION

    앱이 대략적인 위치에 액세스할 수 있도록 허용

     

    ACCESS_FINE_LOCATION

    앱이 정확한 위치에 액세스 할 수 있도록 허용

     

    앱이 정확한 위치를 필요로 하지 않는다면 그렇다는 것(?)을 표시해주어야 한다.

    android:usesPermissionFlags="neverForLocation"

     

    android:makSdkVersion="30"

    앱에 이 권한을 부여해야하는 최상위 API 수준을 의미한다.

    앱에 필요한 권한이 특정 API 수준부터 더이상 필요하지 않은 경우 사용하면 유용하다.

    해결

    공식문서에 따르면 앱이 실제 위치를 필요로 하지 않는 경우

    위의 플래그를 사용해 그렇지 않다는 보장을 해주어야 한단다.

     <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
            android:usesPermissionFlags="neverForLocation"
            tools:targetApi="s" />

    그러니까 위처럼 flag를 지정해줬어야 한다는 거다.

    안드로이드 입장에서는 얘가 위치를 쓰겠다는 건지 안쓰겠다는건지

    AndroidManifset.xml에 선언해놓은 것으로는 도무지 판단할 수 없었으므로

    알아서 검색을 시작하지 않은 것이 아닐지..(maxSdkVersion을 설정해뒀는데도 왜 그런지는 모르겠지만)

    버전 대응 정말 까다롭다 ^^ 히힛

     


    References

    아래 글을 참고하여 작성 되었습니다.

     

    Android 12의 새 블루투스 권한  |  Android Developers

    이제 Android 13 개발자 프리뷰를 사용할 수 있습니다. 지금 사용해 보시고 의견을 알려 주세요. Android 12의 새 블루투스 권한 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고

    developer.android.com

     

    Android 12: BLE Scan does not find any devices

    I'm trying to upgrade a Bluetooth Low Energy app (connects to a custom physical device) to Android 12. I've set up everything as in the documentation, but it doesn't work. Permissions: <uses-

    stackoverflow.com

     

    728x90
    반응형
    댓글