如何重启BluetoothLeScanner?

2024-02-11

我正在使用 Android 端的 BluetoothLeScanner 将 Android 设备连接到 iOS。第一次一切都完美无缺。

问题是,在我连接到其中一台已发现的 iOS 设备后,我停止扫描 (stopScan(scanCallback)) 以节省电量。

如果后来以前连接的设备由于某种原因断开连接,我会再次开始扫描...但“重新启动”扫描似乎不再起作用 - 它不会发现更多设备...不知道为什么,但我被迫重新启动应用程序。

任何想法如何解决这一问题?

我还使用 ScanFilter 按 UUID 过滤设备,并使用 ScanSettings.SCAN_MODE_BALANCED 进行扫描模式。

这是代码:

private void startScanner() {
    BluetoothManager bluetoothManager = (BluetoothManager) activity.getSystemService(activity.BLUETOOTH_SERVICE);
    BluetoothAdapter adapter = bluetoothManager.getAdapter();
    scanner = adapter.getBluetoothLeScanner();
    ScanSettings settings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_BALANCED).build();
    scanner.startScan(scanFilters(), settings, scanCallback);
    System.out.println("Scanner started");
}

private List<ScanFilter> scanFilters() {
    ScanFilter filter = new ScanFilter.Builder().setServiceUuid(THE_BT_UUID).build();
    List<ScanFilter> list = new ArrayList<ScanFilter>(1);
    list.add(filter);
    return list;
}



private final ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        BluetoothDevice device = result.getDevice();
        if (device != null) {
            callback.foundRemoteDevice(BluetoothCentral.this, device);
        }
    }
}


public void connectToDevice(BluetoothDevice device) {
    if (gatt == null) {
        gatt = device.connectGatt(activity, false, gattCallback);
        scanner.stopScan(scanCallback);
    }
}


private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        System.out.println("onConnectionStateChange; status: " + status + ", state: " + newState);

        switch (newState) {
            case BluetoothProfile.STATE_CONNECTED:
                System.out.println("STATE_CONNECTED");
                if (!startedServiceDiscovery) {
                    gatt.discoverServices();
                    startedServiceDiscovery = true;
                }
                break;
            case BluetoothProfile.STATE_DISCONNECTED:
                callback.didDisconnectFromDevice(BluetoothCentral.this, gatt.getDevice());
                gatt = null;
                startScanner();
                break;
            default:
                System.out.println("STATE_OTHER");
        }

    }
}

请注意,我在 connectGatt 调用后立即停止扫描仪,并在收到 BluetoothProfile.STATE_DISCONNECTED 回调时再次启动扫描仪。


由于我的评论帮助您解决了问题,我在这里添加我的评论作为答案。

代码对我来说似乎没问题,您是否尝试在 onScanResult 方法中添加日志? 检查是否检测到设备但其他设备出现故障。 还有一件事,我发现如果重新启动扫描,需要时间才能获取 与第一次扫描的比较中检测到的设备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重启BluetoothLeScanner? 的相关文章

随机推荐

  • OpenCV calibrateCamera() 断言失败

    我已经尝试使用 Opencv calibrateCamera 函数校准我的相机有一段时间了 我遵循了 opencv 示例程序中描述的相同过程 我尝试首先加载 10 个 9 x 6 棋盘图像 然后找到棋盘角 如果找到角点 则角点的像素位置将存
  • 如何在 JavaScript 中添加新元素?

    我创建了一个 JavaScript 脚本 可以将其粘贴到某人的页面上以创建 iFrame 我希望人们能够将脚本粘贴到他们希望 iFrame 出现的位置 但是 我不知道如何将 DOM 创建的 iFrame 附加到粘贴脚本的位置 它总是将其附加
  • 为 html 元素添加点击处理程序?

    我有一个使用 html 预先生成的页面 它看起来像一个可滚动的 div 列表 类似于 div div Item A div div div div Item B div div 我想在我的入口点方法中获取它们 并为每个添加一个单击处理程序
  • 在 Windows 上正确设置 DJANGO_SETTINGS_MODULE

    我有关于这个查询的帖子 但大多数都是针对 Linux 的 没有一个明确适用于 Windows 在我的应用程序中 我正在设置数据库 sqlite3 Django 中的默认值 编辑我的应用程序 mysite 的setting py文件后 DAT
  • 类在目标中被链接多次

    我有两个目标app and appTests 我也有课Wine和框架Realm和 RealmSwift 它们链接到这两个目标 当我使用类时也不例外Wine在目标中app 但是当我想运行测试时 appTests swift 22行 impor
  • 如何销毁由 resque 工作人员排队的工作?

    我在 Rails 3 项目上使用 Resque 来处理计划每 5 分钟运行一次的作业 我最近做了一些事情 使这些工作岗位的创造如滚雪球般增长 目前该堆栈已达到 1000 多个工作岗位 我修复了导致许多作业排队的问题 现在我遇到的问题是由错误
  • ReferenceError:ReactJS Build 中未定义 localStorage

    我在 React 应用程序中的经过身份验证的组件上大量使用 localStorage 以从本地存储获取用户详细信息并在登录时存储它们 当我构建我的应用程序时 它会抛出ReferenceError localStorage is not de
  • RxJava API 和 Java 9 Flow API 之间的区别

    在过去几个主要版本的 Java 的每次迭代中 似乎都有一致的新方法来管理并发任务 在 Java 9 中 我们有Flow API https docs oracle com javase 9 docs api index html java
  • R dplyr mutate_at 访问 colnames

    如何访问正在处理的列名dplyr mutate at 假设我们想要将数据框的列转换为因子 其级别存储在单独的列表中 df lt data frame C1 c A B C C2 c D E F df C1 C2 1 A D 2 B E 3
  • suffix(from:) 和 dropFirst(_:) 之间有什么区别吗?

    我突然想到 在 Swift 中处理子序列时 func suffix from Int 似乎与刚才相同dropFirst 显然 对于长度为 10 的数组 只需将输入值从 3 更改为 7 即可 只是重复一遍 所以 当然 对于一系列的说法长十 我
  • Python 中 switch/case 的语法等价物是什么? [复制]

    这个问题在这里已经有答案了 Programming languages like C C C Java JavaScript and Pascal Reference https en wikipedia org wiki Switch s
  • 删除 Github 上使用 提交的

    我在 github 上有一些提交 如下所示 有没有一种方法可以重新设置基准 以便我可以摆脱这个问题并简单地将提交标记为由我标记 首先我会检查你的 git 是否配置了正确的用户信息 跑步git config list以验证一切是否正确 您还可
  • 自动部署到 F5 负载平衡环境

    我们目前正在使用 TeamCity 进行 CI 构建 并且我们也在尝试设置自动化部署 我当前尝试部署的项目是位于 F5 负载均衡器下的 Windows 服务 将来 我们还希望自动化部署同样位于 F5 下的 IIS 网站 从 TeamCity
  • jquery mobile 外部面板不采用样式

    我正在尝试实现 jQuery mobile 1 4 rc1 中提供的新外部面板 我能够让面板按其应有的方式在所有页面上输入和关闭 但是面板不会继承默认主题 c 的样式 如果使用 data theme a 定义主题也不会继承样式 面板将加载无
  • 从剪贴板保存图像

    我想将 winrt 中剪贴板内的一张图像保存到文件中 但我没有找到办法 你能帮忙吗 var dataPackage Clipboard GetContent var t await dataPackage GetBitmapAsync va
  • 使用 jquery 的 ajax 调用中未设置 HTTP_X_REQUESTED_WITH

    我正在使用 Django 开发一个新网站 我遇到了 ajax 请求的问题 我一直在谷歌上搜索并阅读了很多帖子和文章 大多数都解释相同 问题 ajax 调用已执行 我在视图中收到了请求 但 request is ajax 返回 false 据
  • Vagrant、VirtualBox - 找不到适配器?

    输入 vagrant up 时获取以下日志转储 已尝试在 VirtualBox 上没有任何混乱 并且还手动添加端口转发规则 主机 IP 127 0 0 1 主机端口 2222 访客端口 22 Bringing machine polecat
  • OpenCV.js - 检测MultiScale“无法捕获此异常”

    我正在尝试通过 OpenCV js 使用面部识别 但是当我调用detectMultiScale 的方法CascadeClassifier对象我收到错误 未捕获 6446128 异常捕获已禁用 无法捕获此异常 使用 s DISABLE EXC
  • 使用 Spring Profile 加载 util:properties 会导致 ID 多次出现

    我正在使用 Spring 3 1 配置文件通过 util properties 加载属性文件
  • 如何重启BluetoothLeScanner?

    我正在使用 Android 端的 BluetoothLeScanner 将 Android 设备连接到 iOS 第一次一切都完美无缺 问题是 在我连接到其中一台已发现的 iOS 设备后 我停止扫描 stopScan scanCallback