2017-03-29 13 views
1

BLEデバイスを10秒間スキャンするダイアログがあります。私がスキャンを開始すると、リストのフッターにスピナーが表示されます。スキャンが完了したら、そのスピナーを削除したいと思います。私はこれは、デバイスがバージョン21以上を実行していないかのように、新しいstartScan/stopScan関数の代わりに非推奨のmBluetoothAdapter.stopLeScan(コールバック)関数を使用するようにしています。このメソッドにフォールバックする必要があります。Android BLE LeScanCallback停止時に取得する

stopLeScanにはstartLeScanと同じコールバックが必要ですが、コールバックが作成されているとは思われません。 BluetoohDeviceがヌルであったかどうかを調べるための単純なチェックであることを期待していましたが、スキャンが停止されたためにコールバックが行われましたが、これは機能しませんでした。

旧バージョンのSDKでは、適切なデバイスが見つかったか、スキャン時間が完了したためにスキャンが停止したときにどのようになりましたか?私は私のscanLeDevice関数に別のハンドラを渡すことができますが、私はすでにコールバックを渡しているので、ちょっとばかげているようです。ダイアログボックスで

のBluetoothスキャナ

public class BleDevice { 
    private final static String TAG = BleDevice.class.getSimpleName(); 

    // Stops scanning after 10 seconds. 
    private static final long SCAN_PERIOD = 10000; 

    private BluetoothAdapter mBluetoothAdapter; 
    private boolean mScanning; 
    private Handler mHandler; 

    public BleDevice() { 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     mHandler = new Handler(); 
    } 

    public void scanLeDevice(final boolean enable, final BluetoothAdapter.LeScanCallback callback) { 
     if (enable == true && mScanning == false) { 
      // Stops scanning after a pre-defined scan period. 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        // Turn off scanning 
        scanLeDevice(false, callback); 
       } 
      }, SCAN_PERIOD); 

      mScanning = true; 
      mBluetoothAdapter.startLeScan(callback); 
      Log.d(TAG, "Starting Bluetooth LE scan"); 
     } else if(enable == false && mScanning == true) { 
      mScanning = false; 
      mBluetoothAdapter.stopLeScan(callback); 
      Log.d(TAG, "Stopped Bluetooth LE scan"); 
     } 
    } 
} 

コールバック:callbackmBluetoothAdapter.stopLeScan(callback);

private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { 
    @Override 
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
     Log.d(TAG, device.getAddress() + " " + device.getName() + ""); 
     if(device == null) { 
      Log.d(TAG, "Device is null? stop?"); 
     } else { 
      btAdapter.add(device); 
     } 
    } 
}; 

答えて

0

だけでスキャンを停止するかを識別するために使用され、それが引き金になっていませんcallbackの任意の方法。これは同期操作です。

そして、BluetoothAdapter.LeScanCallbackクラスには、結果を受け取るだけのonLeScan()以外のメソッドもありません。これまで、私はそれを知っているようにすべきで、

... 
} else if(enable == false && mScanning == true) { 
    mScanning = false; 
    mBluetoothAdapter.stopLeScan(callback); 
    Log.d(TAG, "Stopped Bluetooth LE scan"); 
    onScanStopped(); // <--- Remove the spinner here. 
} 

私はstartLeScan()ための任意の自動タイムアウトを認識していないよ:

だから、あなたはスキャンがあなたによって停止されたときにトリガされるように、独自のメソッドを定義することができますstopLeScan()を呼び出すだけで停止します。 onLeScan()がトリガーされてもスキャンは停止しません。

+0

情報ありがとうございました。私はオブザーバーパターンを使用して終了し、自分のコールバックを作成しました –

関連する問題