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

내가 설정하여이를 해결 targetSdkVersion22 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.