Android 蓝牙广播

蓝牙广播

广播

蓝牙状态变化(开关状态)广播

BluetoothAdapter.ACTION_STATE_CHANGED):当蓝牙状态发生变化时发送,可以用于检测蓝牙的开启或关闭状态。

提供了以下 Extra 值来描述相关信息:

  1. BluetoothAdapter.EXTRA_STATE: 表示蓝牙的当前状态。你可以使用 intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR) 来获取该值。其可能的取值包括:

    • BluetoothAdapter.STATE_OFF: 蓝牙已关闭。
    • BluetoothAdapter.STATE_TURNING_OFF: 蓝牙正在关闭中。
    • BluetoothAdapter.STATE_ON: 蓝牙已开启。
    • BluetoothAdapter.STATE_TURNING_ON: 蓝牙正在开启中。
  2. BluetoothAdapter.EXTRA_PREVIOUS_STATE: 表示蓝牙之前的状态。使用 intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, BluetoothAdapter.ERROR) 来获取该值。它的可能取值与 BluetoothAdapter.EXTRA_STATE 相同。

蓝牙设备发现广播

BluetoothDevice.ACTION_FOUND):当蓝牙适配器发现一个新的蓝牙设备时发送,可以用于搜索附近的可用设备。

提供了以下 Extra 值来描述相关信息:

  1. BluetoothDevice.EXTRA_DEVICE: 表示发现的蓝牙设备。通过使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE),你可以获取到发现的蓝牙设备对象,然后可以从该对象中获取设备的名称、地址等信息。

  2. BluetoothDevice.EXTRA_CLASS: 表示发现的蓝牙设备的设备类别。使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_CLASS) 可以获取设备的设备类别对象,你可以从中获取设备的主要设备类别和子设备类别。

  3. BluetoothDevice.EXTRA_NAME: 表示发现的蓝牙设备的名称。使用 intent.getStringExtra(BluetoothDevice.EXTRA_NAME) 可以获取设备的名称。

  4. BluetoothDevice.EXTRA_RSSI: 表示发现的蓝牙设备的信号强度(RSSI,Received Signal Strength Indicator)。

    使用 intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE) 可以获取设备的信号强度,其值是一个 short 类型的整数。

  5. BluetoothDevice.EXTRA_UUID: 表示发现的蓝牙设备支持的服务 UUID(Universally Unique Identifier)。

    通过 intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID),你可以获取到设备支持的服务 UUID 数组。

  6. BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE: 表示发现的蓝牙设备之前的配对状态。

    通过 intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1),你可以获取设备之前的配对状态,它的值可以是以下之一:

    • BluetoothDevice.BOND_NONE: 设备之前没有进行过配对。
    • BluetoothDevice.BOND_BONDING: 设备之前正在进行配对。
    • BluetoothDevice.BOND_BONDED: 设备之前已成功配对。
  7. BluetoothDevice.EXTRA_BOND_STATE: 表示发现的蓝牙设备当前的配对状态。

    通过 intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1),你可以获取设备当前的配对状态,它的值可以是以下之一:

    • BluetoothDevice.BOND_NONE: 设备当前没有配对。
    • BluetoothDevice.BOND_BONDING: 设备当前正在进行配对。
    • BluetoothDevice.BOND_BONDED: 设备当前已成功配对。

蓝牙配对(配对操作)广播

BluetoothDevice.ACTION_PAIRING_REQUEST):当一个蓝牙设备请求与你的设备进行配对时发送,你可以在接收到广播时选择接受或拒绝配对请求。

提供了以下 Extra 值来描述配对请求的相关信息:

  1. BluetoothDevice.EXTRA_DEVICE: 表示触发配对请求的蓝牙设备对象。你可以使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) 来获取该设备对象,从中可以获取设备的名称、地址等信息。

  2. BluetoothDevice.EXTRA_PAIRING_VARIANT: 表示配对请求的变体类型。使用 intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR) 来获取该值。它的可能取值包括:

    • BluetoothDevice.PAIRING_VARIANT_PIN: 需要输入配对 PIN 码。
    • BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION: 需要确认配对的 Passkey。
    • BluetoothDevice.PAIRING_VARIANT_PASSKEY_ENTRY: 需要输入配对的 Passkey。
    • BluetoothDevice.PAIRING_VARIANT_CONSENT: 需要用户同意配对。
    • BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY: 需要在设备上显示配对的 Passkey。
  3. BluetoothDevice.EXTRA_PAIRING_KEY: 当配对请求的变体类型是 BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION 或 BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY 时,表示配对的 Passkey。使用 intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_KEY, BluetoothDevice.ERROR) 来获取该值。

这些 Extra 值提供了有关配对请求的设备、配对类型以及配对所需的附加信息。你可以根据配对请求的类型和相关信息来处理配对操作,例如提示用户输入 PIN 码、显示配对的 Passkey 等。

需要注意的是,这些 Extra 值是整数类型的常量,可以在 BluetoothDevice 类中找到对应的定义。此外,配对请求的处理方式可能因不同的操作系统或蓝牙协议栈而有所变化,因此建议参考相关的文档或开发者资源,以了解特定平台或版本中可用的 Extra 值和处理方法。

(BluetoothDevice.ACTION_PAIRING_CANCEL) 取消配对

ACL 连接状态变化广播

BluetoothDevice.ACTION_ACL_CONNECTED、BluetoothDevice.ACTION_ACL_DISCONNECTED):当蓝牙设备的连接状态发生变化时发送,可以用于检测设备的连接状态。

BluetoothDevice.ACTION_ACL_CONNECTED 广播事件在与远程蓝牙设备建立 ACL 连接时发送,ACL 连接是用于传输数据的基本蓝牙连接。

这个广播事件没有特定的 Extra 值,但可以通过 Intent 中的一些常见 Extra 值来获取有关连接的信息。以下是一些可能的 Extra 值:

  1. BluetoothDevice.EXTRA_DEVICE: 表示已连接的蓝牙设备对象。你可以使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) 来获取该设备对象,从中可以获取设备的名称、地址等信息。

  2. BluetoothDevice.EXTRA_NAME: 表示已连接的蓝牙设备的名称。使用 intent.getStringExtra(BluetoothDevice.EXTRA_NAME) 可以获取设备的名称。

  3. BluetoothDevice.EXTRA_CLASS: 表示已连接的蓝牙设备的设备类别。使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_CLASS) 可以获取设备的设备类别对象,你可以从中获取设备的主要设备类别和子设备类别。

这些 Extra 值提供了有关已建立 ACL 连接的蓝牙设备的基本信息。你可以根据需要使用这些值,例如在应用中显示已连接设备的名称、设备类别等。需要注意的是,这些 Extra 值是根据广播事件提供的,并且可能因操作系统或蓝牙协议栈的不同而有所变化。具体可用的 Extra 值可能会因设备和系统的差异而有所不同,因此建议参考相关文档或开发者资源,以了解特定平台或版本中可用的 Extra 值和处理方法。

蓝牙绑定状态变化(配对状态)广播

BluetoothDevice.ACTION_BOND_STATE_CHANGED 广播事件在蓝牙设备的配对状态发生变化时发送,提供了以下 Extra 值来描述配对状态的变化:

  1. BluetoothDevice.EXTRA_DEVICE: 表示配对状态发生变化的蓝牙设备对象。你可以使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) 来获取该设备对象,从中可以获取设备的名称、地址等信息。

  2. BluetoothDevice.EXTRA_BOND_STATE: 表示当前的配对状态。使用 intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR) 来获取该值。其可能的取值包括:

    • BluetoothDevice.BOND_NONE: 设备当前没有配对。
    • BluetoothDevice.BOND_BONDING: 设备当前正在进行配对。
    • BluetoothDevice.BOND_BONDED: 设备当前已成功配对。
  3. BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE: 表示之前的配对状态。使用 intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR) 来获取该值。它的可能取值与 BluetoothDevice.EXTRA_BOND_STATE 相同。

这些 Extra 值提供了关于配对状态变化的设备和状态信息。你可以根据配对状态的变化来执行相应的操作,例如在配对成功后与设备建立连接、在配对失败后显示错误提示等。

蓝牙服务启动广播

BluetoothAdapter.ACTION_DISCOVERY_STARTED):当蓝牙适配器开始搜索附近的设备时发送。

在 BluetoothAdapter.ACTION_DISCOVERY_STARTED 广播事件中,不提供额外的 Extra 值来描述蓝牙设备的发现过程。该广播事件仅表示蓝牙设备的发现过程已经开始。

蓝牙服务停止广播

(BluetoothAdapter.ACTION_DISCOVERY_FINISHED):当蓝牙适配器停止搜索附近的设备时发送。

在 BluetoothAdapter.ACTION_DISCOVERY_FINISHED 广播事件中,不提供额外的 Extra 值来描述蓝牙设备发现过程的完成状态。该广播事件仅表示蓝牙设备的发现过程已经完成。

蓝牙连接状态广播

BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED):当蓝牙连接状态发生变化时发送,可以用于检测设备的连接状态。

提供了以下 Extra 值来描述蓝牙连接状态的变化:

  1. BluetoothAdapter.EXTRA_CONNECTION_STATE: 表示当前的连接状态。使用 intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, BluetoothAdapter.STATE_DISCONNECTED) 来获取该值。其可能的取值包括:

    • BluetoothAdapter.STATE_DISCONNECTED: 表示蓝牙连接已断开。
    • BluetoothAdapter.STATE_CONNECTING: 表示正在建立蓝牙连接。
    • BluetoothAdapter.STATE_CONNECTED: 表示蓝牙连接已建立。
    • BluetoothAdapter.STATE_DISCONNECTING: 表示正在断开蓝牙连接。
  2. BluetoothAdapter.EXTRA_PREVIOUS_CONNECTION_STATE: 表示之前的连接状态。使用 intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_CONNECTION_STATE, BluetoothAdapter.STATE_DISCONNECTED) 来获取该值。它的可能取值与 BluetoothAdapter.EXTRA_CONNECTION_STATE 相同。

  3. BluetoothDevice.EXTRA_DEVICE: 表示连接状态发生变化的蓝牙设备对象。你可以使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) 来获取该设备对象,从中可以获取设备的名称、地址等信息。

这些 Extra 值提供了关于蓝牙连接状态变化的设备和状态信息。你可以根据连接状态的变化执行相应的操作,例如在连接建立后进行数据传输、在连接断开后进行清理操作等。

蓝牙扫描模式广播

BluetoothAdapter.ACTION_SCAN_MODE_CHANGED):用于检测设备的蓝牙扫描模式变化,例如从可检测到不可检测或从主动扫描模式到被动扫描模式。

提供了以下 Extra 值来描述蓝牙扫描模式的变化:

  1. BluetoothAdapter.EXTRA_SCAN_MODE: 表示当前的蓝牙扫描模式。使用 intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.SCAN_MODE_NONE) 来获取该值。其可能的取值包括:

    • BluetoothAdapter.SCAN_MODE_NONE: 表示蓝牙设备没有启用扫描模式。
    • BluetoothAdapter.SCAN_MODE_CONNECTABLE: 表示蓝牙设备处于可连接模式,可以接受来自其他设备的连接请求。
    • BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE: 表示蓝牙设备处于可连接和可被发现模式,可以接受连接请求并被其他设备发现。
  2. BluetoothAdapter.EXTRA_PREVIOUS_SCAN_MODE: 表示之前的蓝牙扫描模式。使用 intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_SCAN_MODE, BluetoothAdapter.SCAN_MODE_NONE) 来获取该值。它的可能取值与 BluetoothAdapter.EXTRA_SCAN_MODE 相同。

这些 Extra 值提供了关于蓝牙扫描模式变化的信息。你可以根据扫描模式的变化执行相应的操作,例如在设备进入可被发现模式时更新用户界面或显示通知等。

蓝牙音频状态广播

BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED、BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED):用于检测蓝牙音频设备(例如耳机、音箱)的连接状态变化。

提供了以下 Extra 值来描述蓝牙 A2DP(Advanced Audio Distribution Profile)连接状态的变化:

  1. BluetoothProfile.EXTRA_STATE: 表示当前的连接状态。使用 intent.getIntExtra(BluetoothProfile.EXTRA_STATE, BluetoothProfile.STATE_DISCONNECTED) 来获取该值。其可能的取值包括:

    • BluetoothProfile.STATE_DISCONNECTED: 表示 A2DP 连接已断开。
    • BluetoothProfile.STATE_CONNECTING: 表示正在建立 A2DP 连接。
    • BluetoothProfile.STATE_CONNECTED: 表示 A2DP 连接已建立。
    • BluetoothProfile.STATE_DISCONNECTING: 表示正在断开 A2DP 连接。
  2. BluetoothProfile.EXTRA_PREVIOUS_STATE: 表示之前的连接状态。使用 intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_DISCONNECTED) 来获取该值。它的可能取值与 BluetoothProfile.EXTRA_STATE 相同。

  3. BluetoothDevice.EXTRA_DEVICE: 表示连接状态发生变化的蓝牙设备对象。你可以使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) 来获取该设备对象,从中可以获取设备的名称、地址等信息。

这些 Extra 值提供了关于蓝牙 A2DP 连接状态变化的设备和状态信息。你可以根据连接状态的变化执行相应的操作,例如在连接建立后开始音频播放、在连接断开后停止播放等。

蓝牙数据传输广播

BluetoothDevice.ACTION_UUID)是一个蓝牙广播事件,它用于检索远程蓝牙设备支持的服务UUID(Universally Unique Identifier)列表。

当你尝试获取远程蓝牙设备的UUID列表时,你可以注册接收 ACTION_UUID 广播,以便在获取到UUID列表时进行相应的处理。

以下是 ACTION_UUID 广播中的一些相关 Extra 值:

  1. BluetoothDevice.EXTRA_DEVICE:表示远程蓝牙设备对象,你可以使用 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) 来获取该设备对象。

  2. BluetoothDevice.EXTRA_UUID:表示远程蓝牙设备支持的服务UUID列表。你可以使用 intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID) 获取UUID列表,每个UUID以 Parcelable 类型的对象表示。

注意,获取到的 UUID 列表是远程设备支持的服务的 UUID,而不是设备本身的 UUID。每个 UUID 表示一个服务,你可以根据需要使用这些 UUID 来识别并与远程设备上的服务进行交互。

需要注意的是,要使用 BluetoothDevice.ACTION_UUID 广播事件,你需要拥有相应的权限,并且进行过服务发现的操作。并不是所有设备都会返回 UUID 列表,这取决于设备的支持和可见性。

蓝牙操作模式(开关操作)广播

BluetoothAdapter.ACTION_REQUEST_ENABLE、BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE):用于请求用户启用蓝牙或使设备可被其他设备发现。

对于 BluetoothAdapter.ACTION_REQUEST_ENABLE 广播事件,它没有特定的 Extra 值。该广播事件仅用于触发系统级对话框,询问用户是否允许启用蓝牙。

当你发送 BluetoothAdapter.ACTION_REQUEST_ENABLE 广播后,系统会弹出一个对话框,其中包含一个启用蓝牙的请求。用户可以选择允许或拒绝启用蓝牙。

因此,在广播事件的 Extra 中,并没有包含与启用蓝牙相关的特定参数或信息。

在你的应用程序中,你可以使用以下代码示例来触发 BluetoothAdapter.ACTION_REQUEST_ENABLE 广播事件:

java 复制代码
Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetoothIntent, REQUEST_ENABLE_BLUETOOTH);

上述代码中的 REQUEST_ENABLE_BLUETOOTH 是一个请求码,用于在 onActivityResult() 方法中处理用户的响应。

需要注意的是,在发送 BluetoothAdapter.ACTION_REQUEST_ENABLE 广播之前,你需要在 AndroidManifest.xml 文件中声明蓝牙权限(android.permission.BLUETOOTH)。

一旦用户响应了蓝牙启用请求,你可以使用 BluetoothAdapter.ACTION_STATE_CHANGED 广播事件来接收蓝牙状态的变化通知。

扩展

ACL

ACL 是蓝牙技术中的一个术语,表示 "Asynchronous Connectionless Link",即"异步无连接链路"。ACL 是蓝牙传输中的一种连接类型,用于在蓝牙设备之间传输数据。

ACL 连接是蓝牙中最常见的连接类型,它提供了全双工的数据传输通道,可以在蓝牙设备之间进行可靠的数据传输。通过 ACL 连接,蓝牙设备可以互相交换数据,例如传输文件、音频、视频等。

在建立 ACL 连接时,通常需要进行蓝牙配对过程,以确保连接的安全性和数据的保密性。配对是通过交换安全密钥来建立信任关系的过程,可以防止未经授权的设备访问蓝牙数据。

需要注意的是,除了 ACL 连接外,蓝牙还支持其他类型的连接,如 SCO(Synchronous Connection-Oriented)连接用于实时音频传输,LE(Low Energy)连接用于低功耗应用等。每种连接类型都有不同的用途和特点,适用于不同的应用场景。

A2DP

A2DP 是蓝牙技术中的一个重要协议,它代表 "Advanced Audio Distribution Profile",即"高级音频分发配置文件"。A2DP 协议旨在通过蓝牙无线连接传输高质量音频流。

A2DP 协议使得蓝牙设备可以将音频流从源设备(例如手机、电脑、平板电脑等)传输到目标设备(例如耳机、音响、车载音响等)上,实现无线音频播放功能。通过 A2DP,用户可以在不使用传统有线连接的情况下,通过蓝牙将音乐、语音通话等音频内容传输到蓝牙音频接收设备上。

A2DP 提供了高质量的音频传输能力,支持多种音频编码格式,如 SBC(Subband Coding)、AAC(Advanced Audio Coding)、aptX、LDAC 等。这些编码格式可以提供更好的音频质量和更低的音频延迟,以满足用户对音频体验的要求。

A2DP 协议不仅支持音频播放,还支持其他音频功能,如音频控制(播放、暂停、音量调节等)和元数据传输(歌曲信息、艺术家、专辑封面等)。

需要注意的是,为了使用 A2DP 功能,蓝牙设备必须支持 A2DP 协议,并且连接的源设备和目标设备都必须支持相同的音频编码格式才能实现高质量的音频传输。

总之,A2DP 是蓝牙技术中用于无线传输高质量音频流的协议,为用户提供了便捷的无线音频播放功能。

SDP

SDP(Service Discovery Protocol)是蓝牙技术中的一个协议,用于在蓝牙设备之间进行服务发现和属性查询。它允许设备主动查询其他设备支持的服务和属性,从而实现设备之间的互操作性和通信。

SDP 的主要作用是让设备能够了解其他设备的可用服务、服务的属性和特征,以便在建立连接之前进行适当的配置和协商。

以下是 SDP 的一些关键特点和用途:

  1. 服务发现: SDP 允许设备查询其他设备上提供的服务列表。设备可以向目标设备发送服务发现请求,目标设备则返回它所支持的服务的信息,包括服务的 UUID(唯一标识符)、服务的属性和其他相关信息。通过服务发现,设备可以了解到目标设备上的可用服务,并在需要时建立适当的连接。

  2. 属性查询: SDP 还允许设备查询服务的属性和特征。设备可以向目标设备发送属性查询请求,目标设备返回有关特定服务的详细信息,如服务的名称、描述、数据格式等。属性查询使设备能够了解服务的具体特性和用途,以便进行合适的操作和数据交换。

  3. 设备配置: SDP 可用于设备配置和设备间的协商。通过查询和了解目标设备的服务和属性,设备可以根据需要进行适当的配置和协商。例如,设备可以通过 SDP 查询目标设备支持的音频编码格式,然后根据支持的编码格式来配置音频传输参数。

  4. 通信建立: SDP 的服务发现和属性查询是建立蓝牙通信连接的先决条件。在进行蓝牙连接之前,设备通常会执行 SDP 查询,以了解目标设备的服务和属性,然后根据查询结果来决定连接和通信的方式。通过 SDP,设备可以发现和了解其他设备提供的服务,然后根据服务的特性来建立连接和进行数据交换。

需要注意的是,SDP 是蓝牙协议栈中的一部分,用于服务发现和属性查询。在 Android 开发中,可以使用 BluetoothDevice 类的 fetchUuidsWithSdp() 方法来执行 SDP 查询,并通过广播接收到的 BluetoothDevice.ACTION_UUID 广播来获取远程设备的 UUID 列表。

总之,SDP 是蓝牙技术中的一个协议,用于服务发现和属性查询,通过 SDP,设备可以查询其他设备的服务列表、属性和特征,从而实现设备之间的互操作性和通信。