「検索」ボタンを押すと範囲内のすべての Bluetooth デバイス (低エネルギーおよびクラシック) が表示されるように、クラシックおよび低エネルギー Bluetooth デバイスを検索する Android アプリを開発しています。従来の BT 発見と LE スキャンは別のものなので、それらを別々に実装し、それらを 1 つの関数に組み合わせて、次のようにする必要があります。
searchFirstLowEnergyThenClassic() または searchFirstClassicThenLowEnergy()
これを実装するには、他のテクノロジのスキャン/検出をすぐに開始できるように、検出/スキャンがいつ終了するかを知る必要があります。
これが私の実装です:
- Classic BT ディスカバリーを開始
- BluetoothAdapter.ACTION_DISCOVERY_FINISHED を受信しました
- BLE スキャンを開始 -> onReceive action equals(ACTION_DISCOVERY_FINISHED)
- BLE スキャンが終了したら検索を停止します
これは問題ないように見えますが、動作を拡張すると問題が発生します。検索が必要な場合は、最後に接続されたテクノロジに基づいて、LE スキャンまたはクラシック検出で最初に検索を開始します。たとえば、前回デバイスが Classic BT デバイスに接続された場合、searchFirstClassicThenLowEnergy() が実行されます。それ以外の場合は、searchFirstLowEnergyThenClassic() を使用します。
ご想像のとおり、さらに複雑になります。たとえば、Classic BT の検出が終了すると、アプリは検索が終了したかどうか、または LE スキャンを続行する必要があるかどうかを知る必要があります。
この問題もあります。ユーザーが最初のテクノロジのスキャン/検出中に検索を停止すると、BluetoothAdapter.ACTION_DISCOVERY_FINISHED を受け取りますが、検索はユーザーによって終了されるため、LE スキャンを開始するべきではありません。
いくつかのフラグを使用してこれを実装しましたが (ただし、正しく動作しません)、私のコードは非常に汚いように見えます。
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
// Classic Bluetooth discovery ended
lastOpenedType = getLastOpenedType();
if (lastOpenedType == BT_CLASSIC && !isSearchStoppedByUser()) {
// Search should continue with low energy scan
startBtLeScanning();
} else if (lastOpenedType != BT_CLASSIC && !isSearchStoppedByUser()){
// Search ended
searchProgressLayout.setVisibility(View.INVISIBLE);
} else {
// Search ended by user
searchProgressLayout.setVisibility(View.INVISIBLE);
}
}
要するに、誰かがこれについてもっと素晴らしくて簡単な解決策を持っているかどうか尋ねていますか?
PS。可能であれば、ブロードキャストの意図のないソリューションが大歓迎です。