Android BluetoothAdapter stopLeScan和startLeScan注意事项

最近公司应用要接入蓝牙,所以这两天在自己熟悉蓝牙这块的东西。

碰到一个问题是在调用 stopLeScan时 蓝牙依然在扫描,后来发现原因是需要在startLeScan 和stopLeScan 使用同一个对象Callback。

看来,在调用stopLeScan时 系统根据传入的Callback确定要停止的蓝牙扫描。若有说的不对的地方,请大神门指出哈。

查看了下 BluetoothAdapter的源码 stopLeScan方法如下(注意加红加粗的)

 public void stopLeScan(LeScanCallback callback) {
        if (DBG) Log.d(TAG, "stopLeScan()");
        BluetoothLeScanner scanner = getBluetoothLeScanner();
        if (scanner == null) {
            return;
        }
        synchronized (mLeScanClients) {
            ScanCallback scanCallback = mLeScanClients.remove(callback);
            if (scanCallback == null) {
                if (DBG) Log.d(TAG, "scan not started yet");
                return;
            }
            scanner.stopScan(scanCallback);
        }
    }


正确的:(使用同一个Callback)

 private void startOrStopSearchBLE(boolean search) {
        if (search) {
            mBluetoothAdapter.startLeScan(scanCallback);
        } else {
            mBluetoothAdapter.stopLeScan(scanCallback);
        }
    }


 private BluetoothAdapter.LeScanCallback scanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    String struuid = bytes2HexString(scanRecord).replace("-", "").toLowerCase();
                    Log.i("搜索蓝牙设备信息", "device=" + device.getName() + ";rssi=" + rssi + ";scanRecord=" + struuid);


                    mLeDeviceListAdapter.addDevice(device);
                    mLeDeviceListAdapter.notifyDataSetChanged();
                }
            });
        }
    };


错误的:(每次new了一个新的Callback)

private void startOrStopSearchBLE(boolean search) {
        if (search) {
            mBluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback() {
                @Override
                public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
                    
                }
            });
        } else {
            mBluetoothAdapter.stopLeScan(new BluetoothAdapter.LeScanCallback() {
                @Override
                public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {


                }
            });
        }
    }






  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值