48

Androidバージョン6.0にアップグレードした後、デバイスでLocationサービスが有効になっている場合、Bluetooth Low Energy(BLE)スキャンが機能します。参考までにここをクリックしてください:Bluetooth Low Energy startScan on Android 6.0 does not find devicesAndroid 6.0のBluetooth Low Energy Scanningのロケーションを有効にする必要があります

基本的には、アプリと携帯電話の両方に対して許可を有効にする必要があります。これはバグですか?実際に位置情報サービスを有効にしないでスキャンすることは可能ですか?私はすべての自分のアプリケーションのための場所を持つ必要はありません。私は、私はこの方法が必要であることをマニフェストにコースや細かい場所の権限を持つ大丈夫だAPI 21で提供BluetoothLeScannerstartScan()方法を使用していますことを言及しなかった

EDIT 。私はちょうど私のアプリのユーザーが私のアプリを使用するために自分のデバイス(GPSなど)上の位置情報サービスを有効にする必要はありません。

以前は、startScan()メソッドが実行され、電話機でロケーションサービスが無効になっている結果が返されました。しかし、Marshmallowでは、ロケーションサービスが電話で有効にされておらず、コース/細かいロケーションのパーミッションがマニフェストに残っていると、同じアプリケーションが "スキャン"してサイレントに失敗し、結果を返しませんでした。

+0

どのデバイスをお使いですか?私はMoto G 2世代で同じ問題に遭遇しました。 Moto G 1世代とNexus 6は、位置情報サービスを明示的に有効にすることなく、同じコードで正確に動作します。 – shadowhorst

+0

私はMarshmallowを実行しているどのデバイスでも気づいています - Nexus 5X、Samsung S6、Samsung S7、LG G4 –

答えて

22

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

このissueは、これが意図された動作であり、修正できないと回答したGoogleに届けられました。彼らは開発者にthis siteに指示しました。ここで、ハードウェア識別子のアクセスには現在、場所のアクセス許可が必要であると指摘しています。ユーザーに要件を認識させるのは開発者の責任です。

ただし、ロケーションサービス(GPSなど)が必要な理由については言及していません。また、位置情報サービス(GPSなど)が必要な理由については説明していません。意図された動作。

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

+1

これは正解です – KRUKUSA

+0

これを行う最も正しい方法はどれですか? – Mikhail

0

私はEclipseで書かれたコードを見ましたが、そこではマニフェストファイルに位置情報を宣言せずにstartScan(API 21)関数を使用します。私はまだ適切なコールバックを取得します。 ロケーション宣言なしでコードを実行しようとしましたか? 一方、これらの権限を必要としない廃止予定のstartLeScan(API 18)を使用することができます。しかし、私の意見では、サービスでの望ましい特性の検索と読み取りは、API 18の方法ではもっと複雑です。

+0

私は 'BluetoothLeScanner'で' startScan'関数を使用しています。私は非推奨のメソッドを意図的に使用しています。実際、提供されている新しいメソッドを特に使用するために、21より大きいAPIを使用しているデバイスを確認しています。私は場所なしで試してみて、それはただ静かに失敗する。スキャンは実行されますが、何も返されません(API 21のpostメソッドを使用) –

0

私もマニフェストでこれを試しましたが、なぜ許可されていないのですか?起動時にロケーション権限がアプリに表示されますか?そうでない場合は、request for permission on runtimeが必要です。

オープン設定>アプリケーション> YourApplication>権限 と場所を有効にして、結果をスキャンしてみてください:

また、あなたは、あなたのアプリが正常に動作しているかどうかをテストするために、これを確認することができます。

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

+1

ええ、実行時に明示的にアクセス許可を要求し、デバイスの位置情報サービスをオンにする必要があります。しかし、私は、位置情報サービスをオンにしたり、実行時にコースの場所の許可を要求することなく、BLEスキャンを行う方法があるかどうか疑問に思っていました。 –

1

BluetoothAdapter.startDiscovery()を使用できます。
BluetoothスマートデバイスとクラシックBluetoothデバイスの両方をスキャンしますが、ロケーションサービスは有効にする必要はありません。
(あなたはまだAndroidの6上ACCESS_COARSE_LOCATION権限が必要です)

EDIT:
あなたは、Bluetoothスマート/低エネルギーデバイスのためにフィルタリングするために検出されたデバイス上でBluetoothDevice.getTypeを呼び出すことができます。

3

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

+0

Nexus 5xとAndroid 6の私と同じです – protectedmember

8

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

+0

信じられないほどですが、この1つがトリックでした。 Thx @JiTHiN !!! – Billyjoker

+0

すばらしい、ありがとう!たとえば、AltBeaconのような監視をシミュレートするライブラリをどうするか考えていますか?彼らは基本的に同じメカニズムを使用しています... そしてコンパイルバージョンはどうですか?@JiTHiN –

+0

23から22にダウングレードされ、Android 7.0でも動作します。ローカリゼーションを有効にしなければなりませんでした。ローカライゼーションを無効にしてBLEデバイスをスキャンできるようになりました。 –

関連する問題