web-dev-qa-db-ja.com

Android BLEビーコンスキャン

BluetoothLEはAndroid 4.3で追加されましたが、近くの利用可能なBLE UUIDを介して通知されるように登録されると、アプリをウェイクアップするバックグラウンドスキャンモードがないようです。

これは、iOS7とiBeaconsAPIを介して正確に可能であるようです。 Android 4.3にそのような機能があるかどうか、またはBLEデバイスのBLE環境を定期的にスキャンするための適切な回避策があるかどうかを誰かが知っていますか?

http://developer.Android.com/guide/topics/connectivity/bluetooth-le.html

http://techcrunch.com/2013/09/11/estimote-details-ios-7-ibeacon-support-for-its-contextual-proximity-shopping-devices/

14
Sven Haiges

以下のような回避策があると思います。mBluetoothAdapter.startLeScan(mLeScanCallback)を呼び出すには、サービスを実装し、whileループへのスレッドを作成する必要があります。次に、特定のデバイスによってトリガーされるかどうかを確認し、さらに特定のUUIDを検索できます。

10
dull_boy

Androidの例から直接、ハンドラーを使用できます。

private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                    invalidateOptionsMenu();
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        invalidateOptionsMenu();
    }
1
JackAW

私の経験では、実行し続けるサービスを作成するのが最善です。重要なのは、関心のあるビーコンのみをスキャンすることです。そうしないと、ビーコンメッセージを解析するCPUパワーを大量に浪費することになります。

このライブラリは、興味のあるiBeaconsだけをスキャンするのに役立ちます: https://github.com/inthepocket/ibeacon-scanner-Android

また、スキャンが不可能な場合(Bluetoothがオフ、ロケーションがオフ、権限が取り消されているため)、必要なすべての条件が再び満たされるたびにスキャンを再開する必要があります。ここでは、ブロードキャストリスナーが必要になります。

スキャンできる条件:

  • Bluetooth LEチップを持っている:任意。

  • Bluetoothをオンにします:任意。

  • 場所は次のとおりです:Android 6+。

  • ロケーションランタイム権限を持っている:Android 6+。

  • 30秒で最大5回のスキャンを開始:Android 7+。

0
Elias