- 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/
当我看到 Square 使用 iPhone 上的耳机插孔发送信用卡数据后,我对此产生了兴趣。 iPhone、普通笔记本电脑和普通移动设备上耳机插孔的平均带宽是多少? 可以通过在不同 channel
在Mango中是否可以检测是否已连接耳机?我想根据用户是否已连接耳机来更新一些UI元素。 (我真正需要的是耳机中的麦克风) 谢谢你的建议 最佳答案 没有可用的API提供此信息。 您将无法在您的应用中做
我试图让用户能够在应用程序中切换音频输出,并且能够使用AVAudioSession在扬声器和扬声器之间切换,但是在任何情况下我都找不到在连接的蓝牙设备和耳机之间切换的方法订购。 谢谢您的帮助。 最佳答
我运行的是 iOS 4.3.2。 我在我的 iPad 上启动我的应用程序(没有插入电源)。 音频作品。 我插入耳机。 没有音频,iPad 和耳机都没有。 我拔下耳机,转到 (2) 或者: 我在插入耳机
是否可以判断耳机是否已插入Windows Phone 8设备上? 我想使用Text to Speech API,但我不想通过扬声器阅读消息 最佳答案 实际上,是的,您可以使用WP8。这不是一个显而易见
使用AudioUnit和kAudioUnitSubType_HALOutput如何检测输出是Speaker还是Headset? 最佳答案 bool usingInternalSpeakers() {
我的目标: 从我的Android应用程序检测附近的所有蓝牙设备(电话,耳机等)。 这是developer.android.com中的一个很好的示例,该示例发现附近的蓝牙设备以及已配对的设备列表。 我的
如标题,我想知道如何获得我的 voip 应用程序的可用输出声音路径列表,或重现默认的 IOS 效果。此时我可以在用户调用电话时启用/禁用扬声器,但如果用户连接了蓝牙耳机,我希望用户可以选择使用哪条路由
我在使用 AudioRecord 类时遇到一些问题。我有一个应用程序可以在有人通过耳机收听音频时录制音频。在这种情况下,它工作正常。用户可以毫无问题地进行录制。任何使用内置麦克风耳机的用户都无法录音。
是否可以将 Ocullus Rift 或 HTC Vive 等 VR 设备连接到智能手机?我想为 Android 和 iOS 平台开发 VR 应用程序,但使用外部 VR 耳机,例如 Oculus Ri
有没有办法在 java 中获取设备(扬声器、耳机)的 GUID?我正在尝试修改注册表中的特定值,例如我需要这个键名 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wind
因此 iPhone 可以与蓝牙耳机配对并用它来调用电话(尽管使用 3.0 操作系统的 iPod Touch 无法与耳机配对,请看一下)。 但是我可以编写一个可以访问配对的蓝牙设备及其功能(例如耳机的麦
如何让服务监听 android 设备中的媒体按钮(耳机 Hook )。我尝试使用这段代码来做到这一点,但没有奏效。你能帮帮我吗。 服务代码: public class RLservice extend
想要的功能: 它类似于 iPhone 原生手机应用程序。当有蓝牙/耳机连接到 iPhone 时,扬声器按钮(通常只有扬声器/电话切换)将显示所有可用的音频输出设备。默认使用蓝牙。用户可以选择另一个设备
在我的 ipad 中,当我进入蓝牙设置页面时,我可以在已连接列表中看到我的三星耳机设备 (HM 1100)。但是,当我使用以下代码时,我无法获得任何配件。 NSArray *accessories =
我正在寻找一种方法来检测我的 VR 应用程序中使用的耳机名称。我需要区分 任务 1 & 2 为了实现不同的 Controller 映射。 XRDevice.model 或 OVRPlugin.prod
我有一些代码可以从相机捕捉镜头并输出拼接的 360 度视频。我可以将拼接视频输出为 MP4文件,RGBA文件,或 RGBA OpenGL纹理。 我需要以某种方式让我的代码将拼接的视频直播到 VR 耳机
我在 stackoverflow 中搜索我的问题的答案,我看到了很多信息,但我没有找到解决我的问题的方法。我尝试接收按钮诺基亚耳机蓝牙调用接收。 在 list 中我有:
我是一名优秀的程序员,十分优秀!