Android 6.0でBluetooth Low Energyスキャンのために位置情報を有効にする必要があります


99

Androidバージョン6.0にアップグレードした後、Bluetooth Low Energy(BLE)スキャンは、デバイスで位置情報サービスが有効になっている場合にのみ機能します。こちらを参照してください:Android 6.0のBluetooth Low Energy startScanがデバイスを見つけられません

基本的に、アプリだけでなく電話でも有効にする権限が必要です。これはバグですか?位置情報サービスを実際に有効にせずにスキャンすることはできますか?すべてのアプリの場所を用意する必要はありません。

編集 私はAPI 21 startScan()BluetoothLeScanner提供されているのメソッドを使用していることを説明できませんでした。このメソッドに必要なマニフェストのコースと詳細な場所のアクセス許可で問題ありません。アプリのユーザーが自分のデバイスの位置情報サービス(GPSなど)を有効にしてアプリを使用できるようにしたくありません。

以前は、startScan()電話で位置情報サービスを無効にしてメソッドを実行し、結果を返していました。ただし、マシュマロでは、同じアプリケーションが「スキャン」しますが、電話で位置情報サービスが有効になっておらず、コース/ファイン位置情報のアクセス許可がマニフェストに残っている場合、サイレントに失敗して結果が返されませんでした。


どのデバイスを使用していますか?Moto G 2nd Generationでも同じ問題が発生しました。位置情報サービスを明示的に有効にしなくても、Moto G 1st GenerationとNexus 6はまったく同じコードで正常に動作します。
shadowhorst

Marshmallowを実行しているすべてのデバイスで気づきました-Nexus 5X、Samsung S6、Samsung S7、LG G4
V-PTR

回答:


85

いいえ、これはバグではありません。

この問題はGoogleに提起され、Googleはこれが意図された動作であり、修正しないと回答しました。彼らは開発者をこのサイトに誘導し、ハードウェア識別子へのアクセスには現在位置の許可が必要であると指摘しています。現在、ユーザーに要件を認識させるのは開発者の責任です。

ただし、この問題では、位置情報サービス(GPSなど)が必要な理由は取り上げられておらず、意図した動作としてマークされているため、問題を再検討して説明することはないようです。

質問の2番目の部分に答えるには:はい、位置情報サービスを有効にしなくてもスキャンできます。を使用してBluetoothクラシックスキャンを実行できますBluetoothAdapter.getDefaultAdapter().startDiscovery()。これは、位置情報サービスをオフにしても機能します。これにより、すべてのBluetoothデバイス、BLEなどが検出されます。ただし、BLEデバイスには、の結果として表示された場合のスキャンレコードはありませんstartScan()


11
バグではないと主張するGoogleは冷静さを残しています。彼らの態度は明白なBSです。
Marki 2018

21
それは実際のバグではありません-悪意のあるアプリ開発者が既知のBluetoothビーコンをスキャンできれば、ロケーションのパーミッションを要求することで、ユーザーの疑いを引き起こさずにロケーションを突き止めることができます。したがって、BLEアクセスを要求することは、残念ながら、大まかな場所を要求することと同じように扱う必要があります。
ArtHare 2018年

3
@orionelenzil "宣言する必要があるもう1つの権限は、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

Gradleファイルで22に設定targetSdkVersionすることでこれを解決しました。マニフェストで宣言する必要がありますが、ユーザーがアプリ設定からこの権限を拒否した場合でも、BLEスキャンは機能します。ACCESS_COARSE_LOCATION

これは、位置情報の許可を要求しないようにするためのハックです。最新の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を対象としています。」)
エティエンヌ

10

私が見つけたのは、Android 6以降では、ACCESS_COARSE_LOCATION権限を付与する必要があるということです。ただし、一部のデバイスでは、電話の位置情報サービス(GPS)をオンにして周辺機器を検出できるようにする必要もあります。Android 5でNexus 5xを使用していることがわかりました。


1
Nexus 5xとAndroid 6で私も同じです
保護

Android 7.1.1搭載のMoto G5 plusでも同じ
RootCode

3

私はマニフェストでもこれを試しましたが、許可を要求しませんでした。理由はわかりません。アプリは起動時に位置情報の許可を求めていますか?そうでない場合は、ランタイムの許可リクエストする必要があります

また、これをチェックして、アプリが正常に動作しているかどうかをテストできます。

[設定]> [アプリ]> [YourApplication]> [権限]を開き、位置情報を有効にして、結果をスキャンしてみます。

マニフェストにACCESS_COARSE_LOCATIONを指定した場合にのみ、場所がここに表示されます。


1
ええ、実行時に明示的に許可を要求し、デバイスの位置情報サービスをオンにする必要があります。しかし、位置情報サービスをオンにしたり、実行時にコースの位置情報の許可を要求したりすることなくBLEスキャンを実行する方法があるかどうか疑問に思いました。
V-PTR 2015年

権限をリクエストするだけでは不十分です。位置情報サービスも有効になっているかどうかを確認する必要があります。
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

私が最近android 8.0で気付いたことから、BLEスキャンを実行するためにGPSをオンにする必要はありませんが、マニフェストでそれを宣言する必要がありますが、ユーザーは許可を許可する必要があります。

Androidは、startScan()メソッドでスキャンを実行しようとすると、位置情報へのアクセスを許可するようにユーザーに要求します。権限が許可されていない場合、スキャンは失敗します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.