Androidバージョン6.0にアップグレードすると、デバイスでロケーションサービスが有効になっている場合にのみBluetooth Low Energy(BLE)スキャンが機能します。参照用のこちらを参照してください: Bluetooth Low Energy start _Android 6.0でstartScanはデバイスを検出しません
基本的に、アプリと電話で許可を有効にする必要があります。これはバグですか?位置情報サービスを実際に有効にせずにスキャンすることはできますか?すべてのアプリの場所を特定する必要はありません。
EDITAPI 21で提供されるBluetoothLeScanner
のstartScan()
メソッドを使用していることに言及できませんでした。このメソッドが必要とするマニフェスト。アプリのユーザーが自分のアプリを使用するために、デバイス上の位置情報サービス(GPSなど)を有効にする必要はありません。
以前は、startScan()
メソッドが実行され、電話でロケーションサービスが無効になっている結果が返されていました。ただし、マシュマロでは、同じアプリケーションが「スキャン」されますが、電話でロケーションサービスが有効になっておらず、コース/ファインロケーション許可がマニフェストに残っていると、静かに失敗し、結果を返しませんでした。
いいえ、これはバグではありません。
この issue がGoogleに持ち込まれ、彼らはこれが意図された動作であり、修正しないと答えました。開発者に このサイト を指示し、ハードウェア識別子へのアクセスには場所の許可が必要になったと指摘しています。現在、ユーザーに要件を認識させるのは開発者の責任です。
ただし、この問題では、位置情報サービス(GPSなど)が必要な理由に対処しておらず、意図した動作としてマークされているため、これを説明するために問題を再検討するようには見えません。
質問の2番目の部分に回答するには:はい、位置情報サービスを有効にせずにスキャンすることができます。 BluetoothAdapter.getDefaultAdapter().startDiscovery()
を使用してBluetoothクラシックスキャンを実行でき、位置情報サービスをオフにしても機能します。これにより、BLEなどのすべてのBluetoothデバイスが検出されます。ただし、BLEデバイスには、startScan()
の結果として見られた場合にあったはずのスキャンレコードがありません。
GradleファイルでtargetSdkVersion
を22に設定することでこれを解決しました。マニフェストでACCESS_COARSE_LOCATION
を宣言する必要がありますが、ユーザーがアプリの設定からこの許可を拒否しても、BLEスキャンは機能します。
これは、ロケーション許可のリクエストを避けるための単なるハックです。最新のAndroidバージョンをターゲットにした方が良いでしょう。
私が見つけたのは、Android 6の後、ACCESS_COARSE_LOCATION権限を付与する必要があるということです。ただし、一部のデバイスでは、周辺機器を検出できるように、電話の位置情報サービス(GPS)をオンにする必要があります。 Android 7.0でNexus 5xを使用していることがわかりました。
マニフェストでもこれを試しましたが、許可を要求しませんでした。理由はわかりません。アプリは起動時に場所の許可を求めていますか?そうでない場合は、 実行時の許可の要求 にする必要があります。
また、これをチェックして、アプリが正常に動作しているかどうかをテストできます。
[設定]> [アプリ]> [YourApplication]> [アクセス許可]を開き、[場所]を有効にして、結果のスキャンを試みます。
マニフェストでACCESS_COARSE_LOCATIONを指定した場合にのみ、場所がここにリストされます。
BluetoothAdapter.startDiscovery()
を使用できます。
Bluetooth Smartと従来のBluetoothデバイスの両方をスキャンしますが、位置情報サービスを有効にする必要はありません。
(Android 6.には引き続きACCESS_COARSE_LOCATION
権限が必要です。)
見つかったデバイスで BluetoothDevice.getType
を呼び出して、Bluetooth Smart/Low Energyデバイスをフィルタリングできます。
さて、Eclipseで記述されたコードを見て、マニフェストファイルで場所を宣言せずにstartScan(API 21)関数を使用しています。私はまだ適切なコールバックを取得します。場所の宣言なしでコードを実行しようとしましたか?一方、これらの権限を必要としない非推奨のstartLeScan(API 18)を使用できます。ただし、私の意見では、API 18のメソッドを使用すると、サービス内の目的の特性を検索して読み取ることはより複雑になります。
Android 8.0で最近気づいたことから、BLEスキャンを実行するためにGPSをオンにする必要はありませんが、マニフェストで宣言する必要がありますが、ユーザーは許可を許可する必要があります。
startScan()
メソッドでスキャンを実行しようとすると、Androidはユーザーに場所の許可を許可するように求めます。アクセス許可が許可されていない場合、スキャンは失敗します。