BluetoothAdapter不会停止扫描BLE设备

时间:2017-01-31 10:55:27

标签: android bluetooth-lowenergy android-bluetooth

在我的应用程序中,我有开始和停止按钮,当用户按下开始时,我调用startScan方法

bluetoothAdapter.getBluetoothLeScanner().startScan(getLeScanCallback());

当用户按下停止时,我会调用stopScan,但它似乎无法做任何事情。 BluetoothAdapter会不断扫描新设备。

bluetoothAdapter.getBluetoothLeScanner().stopScan(getLeScanCallback());

这是我的getLeScanCallback方法:

private ScanCallback getLeScanCallback(){
    ScanCallback leScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            boolean duplicate = false;
            for(Device d : devices) {
                if(d.getAddress().equals(result.getDevice().getAddress()))
                    duplicate = true;
            }
            if(!duplicate) {
                Device device = new Device();
                device.setName(result.getDevice().getName());
                device.setAddress(result.getDevice().getAddress());
                device.setStatus(getString(R.string.disconnected));
                devices.add(device);
                deviceListAdapter.notifyDataSetChanged();
            }
        }

        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            super.onBatchScanResults(results);
        }

        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);
        }
    };

    return leScanCallback;
}

即使在调用stopScan()之后,它也会被调用。我做错了什么,换句话说,如何停止扫描BLE设备?

4 个答案:

答案 0 :(得分:16)

每当您致电getLeScanCallback时,您都会创建ScanCallback的新实例并失去对前一个实例的引用。

stopScan停止正在进行的扫描,无论你传递的是什么实例但是如果它是一个不同的实例(比你曾经开始的实例)它将不会删除旧的回调实例,所以仍然会在之前传递一些事件它停了。

答案 1 :(得分:4)

扫描结果不会立即停止,但最终会停止。您可以使用以下结果填充待处理结果队列:

scanner.flushPendingScanResults();

但是即便如此,文档很清楚它会将它发现的任何内容发送给回调。即使您已停止扫描,也会发生这种情况。 API设计不佳,但它就是这样。

我认为最简单的方法是设置一个标志,以便在停止扫描后忽略扫描结果。

答案 2 :(得分:1)

我没有注意到您的代码有任何问题,似乎没问题。您的getLeScanCallback()方法可能存在问题吗?

您可以将其声明为leScanCallback = new ScanCallback(),而不是让方法返回您的ScanCallback,然后您可以在尝试停止扫描时引用此成员变量。

bluetoothAdapter.getBluetoothLeScanner().stopScan(leScanCallback);

根据您支持的Android版本,可能值得添加Rajesh Panchal为Lollipop Android设备提供的startLeScanstopLeScan方法。

答案 3 :(得分:-1)

替换

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<!-- HTML -->
<div id="home">
  <button id="gop1">Page1</button>
  <button id="gop2">Page2</button>
 </div>
 <div id="page1">Here is one page <button id="goh1">Home</button></div>
<div id="page2">Here is the second page<button id="goh2">Home</button></div>

<!-- Scripts -->

<script>
$(document).ready(function(){
      $('#gop1').click(function() {
      $('#home, #page1').addClass('moveleft');
      });
  });
</script>
<script>
  $(document).ready(function(){
      $('#goh1').click(function() {
      $('#home, #page1').addClass('movecenter');
      });
  });
</script>
<script>
  $(document).ready(function(){
      $('#gop2').click(function() {
      $('#home, #page2').addClass('moveup');
      });
  });
</script>
<script>
  $(document).ready(function(){
    $('#goh2').click(function() {
      $('#home, #page2').addClass('movedown');
      });
  });
</script>

property_exists($response->Items->Item->OfferSummary,'LowestNewPrice')