Android 6.0에서 Bluetooth 저에너지 검색을 위해 위치를 활성화해야합니다.


99

Android 버전 6.0 BLE (Bluetooth Low Energy)로 업그레이드 한 후 기기에서 위치 서비스가 활성화 된 경우에만 검색이 작동합니다. 여기를 참조하십시오 : Android 6.0의 Bluetooth Low Energy startScan이 장치를 찾지 못함

기본적으로 앱과 전화에 대한 권한을 활성화해야합니다. 이것은 버그입니까? 실제로 위치 서비스를 활성화하지 않고도 스캔 할 수 있습니까? 모든 앱에 대한 위치가 필요하지 않습니다.

편집 API 21 startScan()에 BluetoothLeScanner제공된 방법을 사용하고 있음을 언급하지 못했습니다 .이 방법에 필요한 매니페스트의 코스 및 정밀한 위치 권한에 동의합니다. 내 앱 사용자가 내 앱을 사용하기 위해 장치 (GPS 등)에서 위치 서비스를 활성화하지 않아도되게하고 싶습니다.

이전에는 startScan()메서드가 실행되고 전화기에서 위치 서비스가 비활성화 된 상태로 결과가 반환되었습니다. 그러나 Marshmallow에서는 동일한 애플리케이션이 "스캔"되지만 전화에서 위치 서비스가 활성화되지 않았고 코스 / 미세 위치 권한이 여전히 매니페스트에있을 때 자동으로 실패하고 결과를 반환하지 않았습니다.


어떤 장치를 사용하고 있습니까? Moto G 2 세대에서 동일한 문제가 발생했습니다. Moto G 1st Generation 및 Nexus 6는 명시 적으로 위치 서비스를 활성화하지 않고도 정확히 동일한 코드로 잘 실행됩니다.
— shadowhorst

Marshmallow (Nexus 5X, Samsung S6, Samsung S7, LG G4
— V-PTR)를

답변:


85

아니요, 이것은 버그가 아닙니다.

이 문제 는 Google에 제기되어 이것이 의도 된 동작이며 수정하지 않을 것이라고 응답했습니다. 그들은 개발자를 이 사이트 로 안내하여 이제 하드웨어 식별자 액세스를 위해 위치 권한이 필요하다고 지적했습니다. 이제 사용자가 요구 사항을 인식하도록하는 것은 개발자의 책임입니다.

그러나이 문제에서는 위치 서비스 (GPS 등)가 필요한 이유를 다루지 않으며 의도 된 동작으로 표시 되었기 때문에이를 설명하기 위해 문제를 다시 방문 할 것 같지 않습니다.

질문의 두 번째 부분에 답하려면 : 예, 위치 서비스를 활성화하지 않고도 스캔 할 수 있습니다. 를 사용하여 Bluetooth 클래식 스캔을 수행 할 수 BluetoothAdapter.getDefaultAdapter().startDiscovery()있으며 위치 서비스가 꺼진 상태에서도 작동합니다. 이것은 모든 Bluetooth 장치, BLE 및 기타를 검색합니다. 그러나 BLE 장치는 .NET의 결과로 표시되는 경우 가질 수있는 스캔 레코드를 갖지 않습니다 startScan().


11
구글은 그것이 버그가 아니라고 주장한다. 그들의 태도는 평범한 BS입니다.
— Marki

21
실제로 버그가 아닙니다. 악의적 인 앱 개발자가 알려진 블루투스 비콘을 스캔 할 수 있다면 위치 권한을 요청하여 사용자의 의심을 제기하지 않고도 위치를 파악할 수 있습니다. 따라서 BLE 액세스를 요청하는 것은 안타깝게도 대략적인 위치를 묻는 것과 동일하게 처리되어야합니다.
— ArtHare

3
@orionelenzil "선언해야하는 다른 권한은 ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION입니다. Bluetooth 스캔을 사용하여 사용자의 위치에 대한 정보를 수집 할 수 있으므로 위치 권한이 필요합니다." 에서 developer.android.com/guide/topics/connectivity/bluetooth
— ArtHare

7
이게 똑 바른 지 보자. BLE의 가장 큰 장점은 "LE"비트, 즉 저에너지로 배터리 소모가 줄어든다는 것입니다. 물론 이러한 절감 효과를 얻으려면 배터리 돼지로 알려진 GPS를 켜야하므로 BLE 사용으로 인한 절전 효과를 무효화해야합니다. / 나는 불신으로 고개를 흔든다.
— dgnuff

8
이것은 믿기 힘든 일이야. Google이 위치를 추론하는 데 사용되는 BLE 스캔에 대해 우려한다면 사용자가 GPS 액세스를 허용하도록 강요하여 아기를 목욕물에 버리는 대신 별도의 권한을 추가해야합니다!
— Desty

11

내가 설정하여이를 해결 targetSdkVersion로 22 Gradle을 파일에. ACCESS_COARSE_LOCATION매니페스트에서 선언해야 하지만 사용자가 앱 설정에서이 권한을 거부하더라도 BLE 스캔이 작동합니다.

이것은 위치 권한 요청을 피하기위한 해킹 일뿐입니다. 최신 Android 버전을 타겟팅하는 것이 좋습니다.

편집하다

Google Play에서는 새 앱이 Android 8.0 (API 레벨 26) 이상을 대상으로해야하므로이 솔루션을 더 이상 사용해서는 안됩니다. 앱은 BLE 스캔을 위해 위치 권한을 요청해야합니다.


감사합니다! 예를 들어 AltBeacon과 같은 모니터링을 시뮬레이션하는 라이브러리로 무엇을해야할지 알고 있습니까? 위치없이 작동하지 않습니다 :( 그리고 그들은 기본적으로 동일한 메커니즘을 사용하고 있습니다 ... 그리고 최소 컴파일 버전은 어떻습니까? @JiTHiN
— Shahar Lahav

23에서 22로 다운 그레이드되었으며 Android 7.0에서도 작동합니다. 내 초기 문제는 현지화를 활성화해야한다는 것이 었는데 이제 현지화가 비활성화 된 BLE 장치를 스캔 할 수 있습니다.
— Mariusz Wiazowski

1
이것은 해킹이지만 권장되지 는 않습니다. 항상 최신 sdk 버전을 대상으로하는 것이 좋습니다. 이 작업을 수행하는 적절한 방법은 ACCESS_COARSE_LOCATION런타임 에서 요청하는 것 입니다.
— Aaron

2
이것은 더 이상 해결책이 아닙니다 ( developer.android.com/distribute/best-practices/develop/… 참조). "Google Play에서는 2018 년 8 월 1 일부터 Android 8.0 (API 레벨 26) 이상을 대상으로하는 새로운 앱을 요구합니다. 앱 업데이트는 2018 년 11 월 1 일부터 Android 8.0을 대상으로합니다. ")
— Étienne

10

내가 찾은 것은 Android 6 이후에 ACCESS_COARSE_LOCATION 권한을 부여해야한다는 것입니다. 그러나 일부 장치에서는 GPS (전화 위치 서비스)를 켜야하기 때문에 주변 장치를 찾을 수 있습니다. Android 7.0에서 Nexus 5x를 사용하는 것을 발견했습니다.


1
Nexus 5x 및 Android 6에서도 동일
— protectedmember

Moto G5 plus와 Android 7.1.1에서 동일
— RootCode

3

나는 또한 이것을 매니페스트에서 시도했지만 허가를 요청하지 않았고 이유를 모르겠습니다. 시작시 앱에서 위치 권한을 요청합니까? 그렇지 않은 경우 런타임에 대한 권한 을 요청 해야 합니다 .

또한이를 확인하여 앱이 제대로 작동하는지 테스트 할 수 있습니다.

설정> 앱> YourApplication> 권한을 열고 위치를 활성화 한 다음 결과를 검색해보십시오.

매니페스트에서 ACCESS_COARSE_LOCATION을 제공 한 경우에만 위치가 여기에 나열됩니다.


1
예, 런타임에 명시 적으로 권한을 요청하고 장치의 위치 서비스를 켜야합니다. 하지만 런타임에 위치 서비스를 켜거나 코스 위치 권한을 요청하지 않고도 BLE 스캔을 수행 할 수있는 방법이 있는지 궁금합니다.
— V-PTR

권한을 요청하는 것만으로는 충분하지 않습니다. 위치 서비스도 활성화되어 있는지 확인해야합니다.
— drindt

2

사용할 수 있습니다 BluetoothAdapter.startDiscovery().
Bluetooth Smart 및 클래식 Bluetooth 장치를 모두 검색하지만 위치 서비스를 활성화 할 필요는 없습니다.
( ACCESS_COARSE_LOCATIONAndroid 6에 대한 권한 은 여전히 ​​필요합니다 .)

BluetoothDevice.getType검색된 장치를 호출 하여 Bluetooth Smart / Low Energy 장치를 필터링 할 수 있습니다 .


0

글쎄, 나는 Eclipse로 작성된 코드를 살펴 보았고 매니페스트 파일에 위치 항목을 선언하지 않고 startScan (API 21) 기능을 사용합니다. 여전히 적절한 콜백을받습니다. 위치 선언없이 코드를 실행 해 보셨습니까? 반면에 이러한 권한이 필요하지 않은 더 이상 사용되지 않는 startLeScan (API 18)을 사용할 수 있습니다. 그러나 제 생각에 서비스에서 원하는 특성을 검색하고 읽는 것은 API 18 메서드를 사용하면 더 복잡합니다.


에서 startScan기능을 사용하고 있습니다 BluetoothLeScanner. 의도적으로 더 이상 사용되지 않는 방법을 사용하고 있습니다. 실제로 제공된 새 메서드를 사용하기 위해 21보다 큰 API를 사용하는 장치를 확인하고 있습니다. 나는 위치없이 시도했지만 조용히 실패합니다. 스캔이 실행되지만 아무 것도 반환되지 않습니다 (API 21 이후 방법 사용)
— V-PTR

0

최근 안드로이드 8.0에서 발견 한 바에 따르면 BLE 스캔을 수행하기 위해 GPS를 켤 필요는 없지만 매니페스트에서 선언해야하지만 사용자가 권한을 허용해야합니다.

Android는 startScan()메소드 로 스캔을 시도 할 때 사용자에게 위치 권한을 허용하라는 메시지를 표시합니다 . 권한이 허용되지 않으면 스캔이 실패합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.