- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标:
从我的Android应用程序检测附近的所有蓝牙设备(电话,耳机等)。
这是developer.android.com中的一个很好的示例,该示例发现附近的蓝牙设备以及已配对的设备列表。
我的情况:
我打开了两个蓝牙耳机,但在成功扫描蓝牙后未将其检测到!因此,我深入研究了这个问题,并在某处发现了蓝牙耳机需要切换到配对模式才能被android检测到。
要将耳机切换为配对模式,我必须在打开耳机时长按电源按钮。是的,最后,现在可以通过我的应用程序的扫描检测到蓝牙耳机。
我的问题:
我希望在不将其切换为配对模式的情况下自动检测我的耳机。无法找到检测附近所有打开的蓝牙设备的方法。
最佳答案
因此,这是我在阅读有关Android蓝牙发现的博客,主题,文档,SO答案等之后发现的所有内容。认为这可能对在这里发表我的发现有用。
因此,在有人开始阅读之前,我想澄清一下,我无法找到任何方法来检测附近的已打开但无法发现的蓝牙设备。
检测附近所有的蓝牙设备
我的主要目标是检测附近的所有蓝牙设备。为此,我们在Android中有一个BluetoothAdapter
类,该类具有一个startDiscovery
函数来扫描附近的蓝牙设备。因此,这不符合我的目的,因为需要通过Android的蓝牙扫描发现可检测到的蓝牙设备。我想要的是检测附近的所有蓝牙设备,而不会强迫它们被发现。我开始寻找实现此目标的解决方案。
我从研究Bluetooth protocols开始,发现了用于蓝牙检测,连接和配对的底层协议。对于Android,我发现没有API可以发现/检测已打开但未处于可发现模式的BT设备。
类别为0x00的蓝牙设备将被忽略
在没有强制蓝牙设备进入可发现模式的情况下深入研究此检测问题,导致我们发现在对附近的BT设备进行扫描时会自动忽略标为class 0×00
的蓝牙设备。这个问题在几个地方都有说明。在这里,我列出了一些。
Stackoverflow question
Google group
Discuss DEV
Found in HTC devices
我试图找到解决此问题的方法,是的,我找到了一个解决方法,尽管文档和评论以及此解决方法均指出,它不适用于所有类型的Android设备。无论如何,替代扫描与默认BT扫描相同,但是它还有一些其他工作。成功进行BT扫描后,它将读取Android日志,并检查是否有任何BT设备被跳过。这是here 中描述的简单技巧。有一个Google小组讨论了关于相同解决方法here的问题。
上面的解决方法也不能解决我的问题。需要发现蓝牙耳机以便通过BT扫描检测到。当Android扫描附近的BT设备时,不会跳过它们。根本找不到它们。
蓝牙页面扫描
但是,我再次开始寻找解决方案,再次发现了一些有趣的东西!这来自另一个Stackoverflow answer,它表示,即使蓝牙设备处于不可发现的模式,也可以通过首先知道他的完整MAC地址来知道它是否在附近。我再次引用他的答案以供将来参考,
该技术是尝试PAGE请求,发送构成查找的蓝牙主机MAC标识符的所有6个字节。 PAGE请求允许一个人在知道其BT ADDR时与蓝牙从机连接。处于不可发现模式的设备不响应查询扫描(设备发现意图),但是它们确实响应希望与另一个先前已知的设备连接的设备使用的页面扫描。
我找到了希望并开始寻找,我们如何在Android中启动页面扫描,但这次也失败了。找不到任何类型的API来启动页面扫描。从BluetoothAdapter
类的Android文档中,我知道,当BT扫描开始时,
这通常涉及大约12秒的查询扫描,然后是对每个新设备的页面扫描,以检索其蓝牙名称。
Android文档中有页面扫描的指示,但是令人惊讶的是,任何地方都没有其他有关页面扫描的文档。我输入了Stackoverflow question进行查询。
我们可以通过将BTID列表附加到“已经配对”列表中来“愚弄” Android吗?
不,我没有找到任何办法。我了解了Android蓝牙配对的工作原理。这是nice flow diagram along with detailed reading manual。我们正在尝试使用Android的隐藏API,并可以通过Reflection使用某些隐藏API。然后,我们开始寻找可以用于我的目的的隐藏API。但是,不幸的是,我们未能找到任何隐藏的API来以编程方式在Android的已配对列表中添加BT设备。
以下是一些有用的链接,用于检查蓝牙配对,隐藏的API以及如何通过反射调用它们以供将来参考。
How to initiate pairing
How to use reflection to work with Android's hidden APIs
Here's a google group discussion I followed, some people are facing the same problem we've here
因此,当BT设备处于可发现模式且不在Android的配对列表中时,我可以对其进行配对。就我而言,我使用了蓝牙耳机。它已打开并处于可发现模式。头戴式耳机的BT地址(MAC地址)是已知的。因此,我使用反射从代码中调用了函数createBond
,它可以完美运行。该设备已成功添加到Android的“已配对”列表中。在四处寻找解决方案以达到我的目的时,我发现了一些有趣的东西。
关于已配对设备的有趣观察
我发现,即使我从已配对的列表中将其删除,android也会在其内存中保留先前已配对的设备。让我们一起分享一个案例研究和这里的发现,以便更好地理解。就我而言,耳机之前已配对。
取消配对/从Android忘记耳机
然后关闭耳机。
然后开始扫描附近的蓝牙设备
当然没找到耳机
但是我们浏览了Android日志,发现Android记住了该耳机的绑定状态(配对状态)的变化。
它扫描了先前绑定的耳机,并且报告了远程设备已关闭
这是打印的日志以及我们之前配对然后取消配对的耳机的MAC地址。
PREV_BOND_STATE = 11 // BOND_BONDING (BluetoothDevice.java)
BOND_STATE = 10 // BOND_NONE
REASON = 4 // UNBOND_REASON_REMOTE_DEVICE_DOWN
PREV_BOND_STATE = 11 // BOND_BONDING (BluetoothDevice.java)
BOND_STATE = 10 // BOND_NONE
REASON = 2 // UNBOND_REASON_AUTH_CANCELLED
REASON
已更改,因此我可以理解Android尝试与蓝牙耳机进行连接。耳机不是处于可发现模式,但Android可以找到它并尝试以配对列表的方式连接它。
ACTION_BOND_STATE_CHANGED
添加
intent.addAction
操作时打印此日志。
关于android - 查找附近的所有蓝牙设备(耳机,电话等),而不必使设备处于可发现模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35239880/
我正在尝试在 IN sql 条件下使用数据库字段。我的字段是一串由逗号分隔的值(如 it,en,fr,de),我必须在 WHERE 子句中使用它,如下所示: WHERE d.iso639code =
他大家 我的以下代码有问题: import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp e
在处理 ReadOnlyMany 存储时,我正在努力理解 PersistentVolume 上的容量参数的概念,以及 PersistentVolumeClaim 上的存储请求。如果存储以只读方式安装
我试图让一个 while 循环在另一个 while 循环中工作,我之前已经让它工作过,但无法再次管理它。 我试图计算航类查询中的总记录,然后在小时记录中尝试添加时间。我已经让所有查询单独工作,但是当我
我们的数据库更新性能偶尔会大幅下降。 例如,表 FooTable 我们有大约 40 列与 varchar PK 此外还有 10 个索引。以下查询用时 44 秒,而在其他时候它几乎立即运行。在减速期间,
我可以在 Release模式下使用 Trace.WriteLine 吗? Trace.Write 和 Debug.Write 之间的主要区别是什么? 最佳答案 不同之处在于 Release模式。 当未
我刚刚遇到了一个非常奇怪的场景,并且在其他地方找不到任何相关信息。当 Xcode 在我的断点处中断时,整个系统的所有键盘输入都没有响应。我可以切换到另一个应用程序,但没有记录任何击键。 Xcode 本
我一直在尝试在一组 Raspberry Pi 上设置 K8s 集群。这是我的 GitHub 页面的链接,描述了整个设置: https://github.com/joesan/plant-infra/b
我的 pod 处于 Pending 状态,因为提到的所有答案我都试图获得描述输出但不知道为什么它保持在 Pending 状态: k8s@k8s-master:~/deployment$ kubectl
我已经开发了一个非消耗性的应用内购买iOS应用程序。我已经获取了应用内购买的 bundle 包标识符,并编写了代码并将其提交给appstore ...提交应用程序后,其状态显示在-App Purcha
我有 2 个具有一对多关系的实体,一个地址可以是多个员工。 MySQL 数据库: 地址 address_id INT PK AutoIncr 城市 VARCHAR 国家/地区 VARCHAR 员工 i
我想在我的项目中使用 ProGuard。我激活了选项 minifyEnabled。当我打开使用库 Retrofit2 的 Activity 时,应用程序崩溃并显示: 无法为接口(interface)
我刚刚在 MVC 应用程序中启用了 Application Insights,并注意到在本地调试时,我的 Azure Application Insight 中会捕获跟踪信息。 处于 Debug模式时
我正在使用一个启动和结束线程的类。线程是在构造函数中创建的。只要标志为 TRUE,线程函数就会继续循环。该标志是该类的静态成员。解构器将标志设置为 FALSE。这样,该类的每个实例都有一个关联的线程,
我有一个 Angular PWA。在我从 Angular 5.0 升级到 7.2 之前,它的 service worker 工作完美 升级后,我在/ngsw/state中看到以下错误 Driver s
可能有一些背景:当用户单击它时,我试图在可滚动的全屏 EditText 上方显示一个特定的键盘 View 。问题是如果光标位于 EditText 的底部,它会被弹出的键盘 View 隐藏。 与常规 I
当进度条处于 Activity 状态时禁用后台交互的正确方法是什么。 Box( modifier = Modifier.fillMaxSize(), contentAlignmen
这个问题在这里已经有了答案: Draw Rectangle inside picture box SizeMode Zoom (1 个回答) 关闭 3 年前。 我有一个 PictureBox1,其
我们刚刚开始在 kubernetes 上创建我们的集群。 现在我们尝试部署分蘖,但出现错误: NetworkPlugin cni failed to set up pod "tiller-deploy
我使用 NRPE 插件将一台 Linux 主机配置为 Nagios 监控服务器。 为此,我遵循以下 URL http://www.tecmint.com/how-to-add-linux-host-t
我是一名优秀的程序员,十分优秀!