【问题标题】:How to search for Bluetooth devices?如何搜索蓝牙设备?
【发布时间】:2019-04-12 14:53:29
【问题描述】:

我想构建一个扫描本地蓝牙设备的应用。该应用程序会找到所有已配对的设备,但不会找到未配对的设备。我有一个按钮,当我按下它时,我想在Log 找到的设备中查看。

AndroidManifest 中,我添加了BLUETOOTHBLUETOOTH_ADMINACCESS_COARSE_LOCATION 的权限。

onCreate我得到了默认的蓝牙适配器并得到了配对的设备。

protected void onCreate(Bundle savedInstanceState) {
....
    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if(!bluetoothAdapter.isEnabled()) {
            Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enable, REQUEST_ENABLE_BT);
        }
    pairedDevices = bluetoothAdapter.getBondedDevices();
        ///Add paired Devices
        for(BluetoothDevice device : pairedDevices){
            Log.i("DEVICE", device.getAddress()+" "+device.getName());
            devicesList.add(device);
        }
}

onClick,我执行scanDevices 函数,我使用ScanCallBack

final ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
       super.onScanResult(callbackType, result);
       if(!devicesList.contains(result.getDevice())) {
          Log.i("DEVICE", result.getDevice().getName()+ "  "+result.getDevice().getAddress());
          devicesList.add(result.getDevice());
                }
            }
            @Override
            public void onScanFailed(int errorCode) {
                super.onScanFailed(errorCode);
            }
        };

 bluetoothAdapter.getBluetoothLeScanner().startScan(scanCallback);
 new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
              bluetoothAdapter.getBluetoothLeScanner().stopScan(scanCallback);     
            }
        }, 10000);
}

当我启动应用程序时,它什么也不做,日志中没有打印任何设备,当我尝试调试它时,它甚至不会在 ScanCallBack 中停止。

【问题讨论】:

  • 你知道为什么第一次扫描没有找到所有设备吗?

标签: android bluetooth android-bluetooth


【解决方案1】:

从 Android 6.0 / Marshmallow 开始,任何蓝牙扫描都需要以下两个条件:

  1. 位置权限(ACCESS_COARSE_LOCATION现在够用了,Android Q Beta apparently不行);
  2. 定位服务正在启用并开启。

因此,这意味着在任何运行 Android 6 或更高版本的设备上,您必须使用运行时权限请求系统请求用户授予您访问其位置的权限。但这还不够,用户还必须打开他的定位服务(精度不是问题)。

您可以通过使用 Google Play 服务显示要求用户打开定位服务的弹出窗口来实现这一点,或者您可以重定向到“设置”应用中的定位服务,用户可以在其中打开其设备定位服务。

只要满足这两个条件,当然,如果有设备在范围内,设备就会开始显示在日志中。

注意:这也适用于使用蓝牙经典的简单蓝牙发现。

【讨论】:

  • 你知道为什么第一次扫描没有找到所有设备吗?
  • 不客气!我猜对于第一次扫描,根据硬件的不同,它可能会发生。众所周知,Android 上的 Low Energy 不稳定,并且由于设备种类繁多,这不足为奇。
  • 我还有一个问题,你知道为什么几分钟后它就一直断开连接吗?
  • 断开连接是什么意思?您的意思是您与 LE 设备建立了连接并且该连接在一段时间后关闭?
  • 没错
猜你喜欢
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
相关资源
最近更新 更多