bluetoothheadset不可不看詳解

只有当您希望应用对接受传入连接的服务器套接字进行托管时,才有必要启用可检测性,因为在发起对其他设备的连接之前,远程设备必须能够发现这些设备。 设备发现是一个扫描过程,它会搜索局部区域内已启用蓝牙功能的设备,并请求与每台设备相关的某些信息。 但是,只有在当下接受信息请求时,附近区域的蓝牙设备才会通过启用可检测性响应发现请求。 如果设备已启用可检测性,它会通过共享一些信息(例如设备的名称、类及其唯一的 MAC 地址)来响应发现请求。 借助此类信息,执行发现过程的设备可选择发起对已检测到设备的连接。 本文介绍不同的蓝牙配置文件,包括健康设备配置文件。

当客户端调用此方法后,系统会执行 SDP 查找,以找到带有所匹配 UUID 的远程设备。 如果查找成功并且远程设备接受连接,则其会共享 RFCOMM 通道以便在连接期间使用,并且 connect() 方法将会返回。 如果连接失败,或者 connect() 方法超时(约 12 秒后),则此方法将引发 IOException。 如果远程设备在开放服务器套接字上接受连接,则为了发起与此设备的连接,您必须首先获取表示该远程设备的 BluetoothDevice 对象。

bluetoothheadset: 蓝牙概览

换言之,当客户端尝试连接此设备时,它会携带 UUID,从而对其想要连接的服务进行唯一标识。 为了让服务器接受连接,这些 UUID 必须互相匹配。 SCAN_MODE_CONNECTABLE_DISCOVERABLE 设备处于可检测到模式。 SCAN_MODE_CONNECTABLE 设备未处于可检测到模式,但仍能收到连接。 SCAN_MODE_NONE 设备未处于可检测到模式,且无法收到连接。 如果您要发起对远程设备的连接,则无需启用设备可检测性。

此方法会调用 write(byte[]),从而将数据发送到远程设备。 应用特定 manageMyConnectedSocket() 方法旨在启动用于传输数据的线程(详情请参阅管理连接部分)。 通常,在完成传入连接的侦听后,您应立即关闭您的 BluetoothServerSocket。

bluetoothheadset

第二个必须声明的权限是 ACCESS_FINE_LOCATION。 您的应用需要此权限,因为蓝牙扫描可用于收集用户的位置信息。 此类信息可能来自用户自己的设备,以及在商店和交通设施等位置使用的蓝牙信标。 注意:您应始终调用 cancelDiscovery(),以确保设备在您调用 connect() 之前不会执行设备发现。 如果正在执行发现操作,则会大幅降低连接尝试的速度,并增加连接失败的可能性。

使用 getProfileProxy() 与配置文件所关联的配置文件代理对象建立连接。 在以下示例中,配置文件代理对象是一个 BluetoothHeadset 实例。 由于 connect() 是阻塞调用,因此您应始终在主 Activity(界面)线程以外的线程中执行此连接步骤。 使用完 BluetoothSocket 后,请务必调用 close()。 这样,您便可立即关闭连接的套接字,并释放所有相关的内部资源。

bluetoothheadset: 连接设备

如图 2 所示,系统将显示对话框,请求用户允许将设备设为可检测到模式。 如果用户响应“Yes”,则设备会变为可检测到模式,并在指定时间内保持该模式。 然后,您的 Activity 将会收到对 onActivityResult() 回调的调用,其结果代码等于设备可检测到的持续时间。 如果用户响应“No”或出现错误,则结果代码为 RESULT_CANCELED。 注意:如果您将 EXTRA_DISCOVERABLE_DURATION Extra 属性的值设置为 0,则设备将始终处于可检测到模式。 注意:执行设备发现将消耗蓝牙适配器的大量资源。

bluetoothheadset

当前的 Android Bluetooth API 要求规定,只有先对设备进行配对,然后才能建立 RFCOMM 连接。 在使用 Bluetooth API 发起加密连接时,系统会自动执行配对。 成功连接至健康设备后,使用文件描述符对健康设备执行读/写操作。

因此,在尝试连接设备时,您的应用无需担心设备是否已配对。 在用户成功配对两台设备之前,您的 RFCOMM 连接尝试会一直阻塞,并且如果用户拒绝配对,或者配对过程失败或超时,则该尝试便会失败。 如要发起与蓝牙设备的连接,您只需从关联的 BluetoothDevice 对象获取 MAC 地址,您可通过调用 getAddress() 检索此地址。 例如,应用可接收指示所连接设备电池电量的广播,并根据需要通知用户或采取其他操作。

然后,线程会等待从 InputStream 中读取更多字节。 借助线程的 cancel() 方法,您可通过关闭 BluetoothSocket 随时终止连接。 请注意,如果 accept() 返回 BluetoothSocket,则表示已连接套接字。 因此,您不应像从客户端那样调用 connect()。

  • 如果您要发起对远程设备的连接,则无需启用设备可检测性。
  • 因此,线程中的主循环应专门用于从 InputStream 中读取数据。
  • 另一台设备会使用服务发现过程找到此可检测到的设备。

蓝牙立体声音频传输配置文件 定义如何通过蓝牙连接和流式传输,将高质量音频从一个设备传输至另一个设备。 Android 提供 BluetoothA2dp 类,该类是用于控制蓝牙 A2DP 服务的代理。 UUID 是一种标准化的 128 位格式,可供字符串 ID 用来对信息进行唯一标识。 UUID 的特点是其足够庞大,因此您可以选择任意随机 ID,而不会与其他任何 ID 发生冲突。 在本例中,其用于对应用的蓝牙服务进行唯一标识。

如要在应用中使用蓝牙功能,您必须声明两个权限。 您需要此权限才能执行任何蓝牙通信,例如请求连接、接受连接和传输数据等。 请注意,此段代码在尝试连接之前先调用了 cancelDiscovery()。

bluetoothheadset

BluetoothServerSocket表示用于侦听传入请求的开放服务器套接字(类似于 TCP ServerSocket)。 如要连接两台 Android 设备,其中一台设备必须使用此类开放一个服务器套接字。 当远程蓝牙设备向此设备发出连接请求时,该设备接受连接,然后返回已连接的 BluetoothSocket。 BluetoothClass描述蓝牙设备的一般特征和功能。

  • BluetoothDevice表示远程蓝牙设备。
  • 一种实现技术是自动将每台设备准备为一个服务器,从而使每台设备开放一个服务器套接字并侦听连接。
  • 如要连接两台 Android 设备,其中一台设备必须使用此类开放一个服务器套接字。
  • 服务器设备和客户端设备均会以不同方法获得所需的 BluetoothSocket。
  • 从 Android 3.0 开始,Bluetooth API 便支持使用蓝牙配置文件。
  • 这种情况下,每台设备都能获得输入和输出流式传输,并开始传输数据,相关详细介绍请参阅管理连接部分。

但是,如果应用需要确定是否正在执行设备发现,您可以使用 isDiscovering() 进行检测。 通过调用 accept() 开始侦听连接请求。 当服务器接受连接或异常发生时,该调用便会返回。

柯文思

柯文思

Eric 於國立臺灣大學的中文系畢業,擅長寫不同臺灣的風土人情,並深入了解不同範疇領域。