Android13 BluetoothAdapter

一、BluetoothAdapter介绍

BluetoothAdapter是Android平台上的一个类,它提供了一些方法来管理本地蓝牙适配器的状态和连接。在Android应用程序中,可以使用BluetoothAdapter来执行以下操作:

  • 检查设备是否支持蓝牙

  • 打开或关闭本地蓝牙适配器

  • 扫描可用的蓝牙设备

  • 获取已配对的蓝牙设备列表

  • 建立与其他蓝牙设备的连接

  • 发现其他蓝牙设备的服务

以下是一个使用BluetoothAdapter的例子,它演示了如何检查设备是否支持蓝牙并打开蓝牙适配器:

// 检查设备是否支持蓝牙
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
    // 设备不支持蓝牙
    return;
}

// 打开蓝牙适配器
if (!bluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

获取远端设备实例:

可使用getRemoteDevice方法。其入参是远端设备地址,返回结果是一个BluetoothDevice对象。其中地址必须是大写的格式、或者6bytes的地址类型。地址格式错误将抛出异常。

获取本地蓝牙是否打开:

可使用isEnabled方法。无入参,如果本地蓝牙已打开,则返回true。如果蓝牙当前已启用并可用,则返回true。也可以使用等效于:getState() == BluetoothAdapter.STATE_ON来判断。

获取本地蓝牙状态:

getState方法。无入参,返回值为BluetoothAdapter.STATE_OFF、BluetoothAdapter.STATE_TURNING_ON、BluetoothAdapter.STATE_ON、BluetoothAdapter.STATE_TURNING_OFF中的一个。

打开蓝牙:

enable方法。无入参,调用后若返回false,则打开失败(如飞行模式调用)。若返回true,则尝试打开。而打开的状态变化及结果,则在BluetoothAdapter.ACTION_STATE_CHANGED广播中监听。打开蓝牙时的状态变化:STATE_OFF->STATE_TURNING_ON->STATE_ON或STATE_OFF。

注意:官方要求不能在用户未同意的时候打开蓝牙。如果需要打开,可以使用 BluetoothAdapter.ACTION_REQUEST_ENABLE Intent来打开系统的用户确认页面。

关闭蓝牙:

disable方法。与打开蓝牙的策略一样。其状态变化为:STATE_ON->STATE_TURNING_OFF->STATE_ON或STATE_OFF。

获取/设置本机蓝牙信息:

getAddress方法:

无入参,返回String类型的Mac地址。

setName方法:

设置本机蓝牙名称。入参为要设置的名称,返回设置是否成功。

getName方法:

获取本机蓝牙名称。无入参,返回String类型蓝牙名称。

蓝牙扫描模式:

getScanMode方法:无入参,返回蓝牙扫描模式。

蓝牙扫描模式包括:

SCAN_MODE_NONE:不可用状态。蓝牙关闭时的状态。

SCAN_MODE_CONNECTABLE:可主动连接但无法被远端设备发现

SCAN_MODE_CONNECTABLE_DISCOVERABLE:可主动连接,也可被远端发现并连接

setScanMode方法可以设置蓝牙扫描模式:

入参为:

mode:蓝牙扫描状态(上个接口已描述)。

durationMillis:可被发现的时间。用于规定本机蓝牙多少时间内可被发现。(若不使用该入参,则会有默认超时时间。getDiscoverableTimeout可获取默认超时时间。setDiscoverableTimeout可以设置默认超时时间。)

开始/停止设备发现(扫描):

startDiscovery方法:该方法用于启动设备发现程序。无入参,立刻返回是否启动成功(蓝牙必须打开并可用,否则返回false)。

设备发现的状态通过ACTION_DISCOVERY_STARTED和ACTION_ DISCOVERY_ FINISHED广播进行回调。发现设备时通过ACTION_FOUND广播进行回调。

设备发现会进行12秒左右。期间比较消耗蓝牙带宽。可通过cancelDiscovery方法主动停止设备发现。

isDiscovering方法来获取当前是否处于设备发现期间

getDiscoveryEndMillis方法可获取最近一次扫描的结束时间

获取已配对的设备:

使用getBondedDevices方法。无入参,返回一个已配对的蓝牙实例集合。必须打开蓝牙后调用。

获取蓝牙连接状态:

使用getProfileConnectionState方法。入参为连接协议(一个设备可以以多个协议连接蓝牙)。是BluetoothProfile.HEADSET, BluetoothProfile.A2DP等中的一个。返回值为BluetoothProfile.STATE_DISCONNECTED, BluetoothProfile.STATE_CONNECTING, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_DISCONNECTING中的一个。

获取各协议的操作代理(重要):

使用getProfileProxy方法。可以获取到各个协议的操作代理,针对单个协议进行细化操作,如蓝牙的连接与断开、各协议特有的状态及能力等。入参为Context、BluetoothProfile.ServiceListener以及profile。

其中BluetoothProfile.ServiceListener需要自己实现,代理获取成功后有该监听回调。profile则在BluetoothProfile中有定义。当代理不再使用后,需要使用closeProfileProxy来关闭它。

二、BluetoothAdapter相关接口

IBluetooth

System private API for talking with the Bluetooth service.

用于与蓝牙服务通信的系统专用 API。

IBluetooth代码位于:

packages/modules/Bluetooth/system/binder/android/bluetooth/IBluetooth.aidl

IBluetooth的定义:

interface IBluetooth {}

IBluetoothCallback

System private API for Bluetooth service callbacks.

用于蓝牙服务回调的系统专用 API。

IBluetoothCallback代码位于:

packages/modules/Bluetooth/system/binder/android/bluetooth/IBluetoothCallback.aidl

IBluetoothCallback的定义:

interface IBluetoothCallback

BluetoothProfile

Bluetooth profile是基于蓝牙的设备之间通信的无线接口规范。BluetoothHeadset、BluetoothA2dp、BluetoothPbap 、BluetoothGatt等类实现了BluetoothProfile接口。

Android Bluetooth API完成了下面的Bluetooth profile:

HEADSET、A2DP、HID_HOST、PAN、PBAP、GATT、GATT_SERVER、MAP、SAP、A2DP_SINK、AVRCP_CONTROLLER、AVRCP、HEADSET_CLIENT、PBAP_CLIENT、MAP_CLIENT、HID_DEVICE、OPP、HEARING_AID、LE_AUDIO、VOLUME_CONTROL、MCP_SERVER、CSIP_SET_COORDINATOR、LE_AUDIO_BROADCAST、LE_CALL_CONTROL、HAP_CLIENT、LE_AUDIO_BROADCAST_ASSISTANT、BATTERY

下面是使用profile的基本步骤:

获取默认的Bluetooth适配器。

  1. 使用BluetoothAdapter.getProfileProxy()来建立一个与profile相关的profile协议对象的连接。

  2. 设置BluetoothProfile.ServiceListener。该listener通知BluetoothProfile IPC客户端,当客户端连接或断连服务器的时候

  3. 在android.bluetooth.BluetoothProfile) onServiceConnected()内,得到一个profile协议对象的句柄。

  4. 一旦拥有了profile协议对象,就可以用它来监控连接的状态,完成于该profile相关的其他操作。

BluetoothProfile代码位于:

packages/modules/Bluetooth/framework/java/android/bluetooth/BluetoothProfile.java

BluetoothProfile的定义:

public interface BluetoothProfile {
    public interface ServiceListener {
        public void onServiceConnected(int profile, BluetoothProfile proxy);
        public void onServiceDisconnected(int profile);
    }
}

三、BluetoothAdapter相关类

BluetoothAdapter

代表本地设备蓝牙适配器。 BluetoothAdapter可让您执行基本的蓝牙任务,例如启动设备发现,查询绑定(配对)设备列表,使用已知MAC地址实例化BluetoothDevice ,并创建一个BluetoothServerSocket以侦听来自其他设备的连接请求,并启动扫描蓝牙LE设备。

为了得到一个BluetoothAdapter代表本地蓝牙适配器,上JELLY_BEAN_MR1运行及以下,调用静态时getDefaultAdapter()方法; 当在JELLY_BEAN_MR2及更高版本上运行时,请致电getAdapter() 。 从根本上说,这是您所有蓝牙操作的起点。 一旦拥有本地适配器,您就可以获得一组代表所有配对设备的BluetoothDevice对象,其中getBondedDevices() ; 用startDiscovery()启动设备发现; 或创建BluetoothServerSocket听与传入的连接请求listenUsingRfcommWithServiceRecord(String, UUID) ; 或使用startLeScan(LeScanCallback)开始扫描蓝牙LE设备。

BluetoothAdapter是Android平台上的一个类,它提供了一些方法来管理本地蓝牙适配器的状态和连接。如果你想在Android应用程序中使用蓝牙功能,你需要使用BluetoothAdapter类来执行以下操作:

  1. 检查设备是否支持蓝牙功能。

  2. 打开或关闭本地蓝牙适配器。

  3. 扫描可用的蓝牙设备。

  4. 建立与其他蓝牙设备的连接。

  5. 与其他蓝牙设备进行数据传输。

BluetoothAdapter代码位于:

packages/modules/Bluetooth/framework/java/android/bluetooth/BluetoothAdapter.java

BluetoothAdapter的定义:

public final class BluetoothAdapter {
    public interface LeScanCallback {}
}

BluetoothAdapter API:

boolean enable():打开本地蓝牙适配器 - 不要使用没有明确的用户操作来打开蓝牙。
boolean disable():关闭本地蓝牙适配器 - 不要使用没有明确的用户操作来关闭蓝牙。
boolean startDiscovery():启动远程设备发现过程。
boolean cancelDiscovery():取消当前的设备发现过程。
boolean setName(String name):设置本地蓝牙适配器的蓝牙名称。
static boolean checkBluetoothAddress(String address):验证字符串蓝牙地址,例如“00:43:A8:23:10:F0”字母字符必须大写才能有效。
void closeProfileProxy(int profile, BluetoothProfile proxy):关闭配置文件代理连接到服务。
String getAddress():返回本地蓝牙适配器的硬件地址。
Set<BluetoothDevice> getBondedDevices():将绑定(配对)的 BluetoothDevice对象返回到本地适配器。
static BluetoothAdapter getDefaultAdapter():获取默认本地蓝牙适配器的句柄。
String getName():获取本地蓝牙适配器的友好蓝牙名称。
int getProfileConnectionState(int profile):获取配置文件的当前连接状态。
boolean getProfileProxy(Context context, BluetoothProfile.ServiceListener listener, int profile):获取与配置文件关联的配置文件代理对象。
BluetoothDevice getRemoteDevice(byte[] address):获取给定蓝牙硬件地址的 BluetoothDevice对象。
BluetoothDevice getRemoteDevice(String address):获取给定蓝牙硬件地址的 BluetoothDevice对象。
int getScanMode():获取本地蓝牙适配器的当前蓝牙扫描模式。
int getState():获取本地蓝牙适配器的当前状态。
boolean isDiscovering():如果本地蓝牙适配器当前处于设备发现过程中,则返回true。
boolean isEnabled():如果蓝牙当前已启用且可以使用,则返回true。
int setScanMode(@ScanMode int mode) :设置蓝牙可见性,隐藏方法。

AdapterService

AdapterService是Android中的一个系统服务,它是一个抽象类,用于管理各种Adapter的生命周期。AdapterService提供了一种机制,使得应用程序可以通过注册AdapterService来获取Adapter的客户端代理对象,从而与Adapter进行通信。

在Android中,AdapterService通常用于管理蓝牙、Wi-Fi、NFC等无线通信模块的Adapter。通过AdapterService,应用程序可以获取Adapter的状态信息、扫描周围的设备、连接设备等操作。

AdapterService代码位于:

packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AdapterService.java

AdapterService的定义:

public class AdapterService extends Service {
    private static class RfcommListenerData {}
    public static class AdapterServiceBinder extends IBluetooth.Stub {}
}

AdapterState

AdapterState定义了蓝牙适配器的状态。在Android中,蓝牙适配器的状态可以是以下之一:STATE_OFF,STATE_TURNING_ON,STATE_ON,STATE_TURNING_OFF。您可以使用AdapterState来检查蓝牙适配器的当前状态并执行相应的操作。例如,如果适配器处于STATE_ON状态,则可以开始扫描周围的蓝牙设备。

AdapterState代码位于:

packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AdapterState.java

AdapterState的定义:

final class AdapterState extends StateMachine {
    private abstract class BaseAdapterState extends State {}
    private class OffState extends BaseAdapterState {}
    private class BleOnState extends BaseAdapterState {}
    private class OnState extends BaseAdapterState {}
    private class TurningBleOnState extends BaseAdapterState {}
    private class TurningOnState extends BaseAdapterState {}
    private class TurningOffState extends BaseAdapterState {}
    private class TurningBleOffState extends BaseAdapterState {}
}

AdapterProperties

Android蓝牙的AdapterProperties是指蓝牙适配器的属性,可以通过BluetoothAdapter类中的方法获取。

AdapterProperties代码位于:

packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AdapterProperties.java

AdapterProperties的定义:

class AdapterProperties {
    private BroadcastReceiver mReceiver = new BroadcastReceiver() {}
}

BondStateMachine

BondStateMachine是Android中的一个状态机,用于处理蓝牙设备之间的配对和绑定过程。它是通过AdapterService来实现的,AdapterService是一个系统级别的服务,用于管理蓝牙适配器和所有相关的蓝牙功能。BondStateMachine的主要作用是处理蓝牙设备之间的配对和绑定请求,以及管理设备之间的连接状态。在BondStateMachine中,有多个状态和事件,例如开始配对、配对成功、配对失败等,每个状态和事件都有对应的处理方法。BondStateMachine还可以与其他状态机进行交互,例如AdapterState和BluetoothStateMachine等。通过这些状态机的协作,Android系统可以提供完整的蓝牙功能。

StableState:是指已经完成蓝牙配对的状态

PendingCommandState:等待蓝牙配对命令的状态

BondStateMachine代码位于:

packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/BondStateMachine.java

BondStateMachine的定义:

final class BondStateMachine extends StateMachine {
    private class StableState extends State {}
    private class PendingCommandState extends State {} 
}

RemoteDevices

Android蓝牙RemoteDevices是指通过蓝牙与其他设备建立连接并进行通信的设备。在Android中,可以通过BluetoothAdapter类来获取已配对的远程设备列表,也可以通过搜索来发现新的设备并进行配对。一旦建立了连接,就可以使用BluetoothSocket类来进行数据传输。

RemoteDevices代码位于:

packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/RemoteDevices.java

RemoteDevices的定义:

final class RemoteDevices {
    private class RemoteDevicesHandler extends Handler {}
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {}
    class DeviceProperties {}
}

JniCallbacks

JniCallbacks代码位于:

packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/JniCallbacks.java

JniCallbacks的定义:

final class JniCallbacks {}

五、BluetoothAdapter相关流程分析

BluetoothAdapter enable流程分析

待更新

BluetoothAdapter startDiscovery流程分析

待更新

BluetoothAdapter getProfileProxy流程分析

待更新

BluetoothAdapter getRemoteDevice流程分析

待更新

BluetoothAdapter getDefaultAdapter流程分析

待更新

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android BluetoothAdapterAndroid系统提供的一个API,用于管理设备的蓝牙功能。通过BluetoothAdapter,我们可以实现蓝牙设备的搜索、配对、连接和数据传输等操作。 使用BluetoothAdapter的第一步是获取到BluetoothAdapter的实例。可以使用getDefaultAdapter()方法来获取默认的BluetoothAdapter实例,或者通过BluetoothManager的getAdapter()方法来获取指定设备BluetoothAdapter实例。 获取到BluetoothAdapter实例后,就可以开始使用其提供的方法来进行蓝牙功能的操作。其中一些常用的方法包括: 1. isEnabled(): 判断蓝牙是否已经开启,返回一个boolean值。 2. enable(): 开启蓝牙功能。 3. disable(): 关闭蓝牙功能。 4. startDiscovery(): 开始搜索附近的蓝牙设备。 5. cancelDiscovery(): 取消搜索操作。 6. getBondedDevices(): 获取已经配对的蓝牙设备,返回一个Set集合。 7. createBond():配对指定的蓝牙设备。 8. getRemoteDevice():根据设备的MAC地址获取到远程蓝牙设备BluetoothDevice实例。 9. getBluetoothLeScanner():获取BluetoothLeScanner实例,用于进行低功耗蓝牙扫描。 10. getProfileProxy():获取BluetoothProfile实例,可用于连接和控制各种蓝牙设备,如蓝牙音频设备、蓝牙耳机等。 通过以上方法,我们可以实现蓝牙设备的搜索、配对、连接和断开连接等功能。同时,还可以使用其他相关的方法和回调来实现更多的蓝牙功能,如数据的传输和通信。 总之,Android BluetoothAdapter是一个重要的API,可以帮助我们在Android设备上实现各种蓝牙功能,提供了丰富的方法和回调来满足开发需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值