Android 低功耗蓝牙(BLE)开发(2)-- BluetoothAdapter详解

来源:互联网 发布:html源码怎么用 编辑:程序博客网 时间:2024/04/30 12:49
来看一下官方的API文档

接口定义主要有:


主要类有:


下面来对我们使用到的一些类进行说明

BluetoothAdapter类

1.概述
代表本地蓝牙适配器设备,通过该适配器来对蓝牙执行一些基本的任务,如:初始化设备的搜索, 查询可匹配的设备列表,使用一个已知的Mac地址来初始化一个BluetoothDevice类,创建一个BluetoothServerSocket类以监听其他设备对本机的连接请求

2 常量

(1)STATE(开关状态值)
  • 蓝牙开启:int STATE_ON :指明本地蓝牙适配器模块已经打开。:常量值: 12 (0x0000000c)
  • 蓝牙关闭:int STATE_OFF :指明本地蓝牙适配器模块已经关闭。常量值: 10 (0x0000000a)
  • 蓝牙开启中:int STATE_TURNING_ON:指明本地蓝牙适配器模块正在打开. 然而本地客户在尝试使用这个适配器之前需要为STATE_ON状态而等待。常量值11 (0x0000000b)
  • 蓝牙关闭中:int STATE_TURNING_OFF:指明本地蓝牙适配器模块正在关闭。本地客户端可以立刻尝试友好地断开任意外部连接。常量值: 13 (0x0000000d)
  • 蓝牙连接中:int STATE_CONNECTING:常量值1 (0x00000001)
  • 蓝牙已连接:int STATE_CONNECTED:常量值: 2 (0x00000002)
  • 蓝牙断开中:int STATE_DISCONNECTING:常量值: 3 (0x00000003)
  • 蓝牙已断开: int STATE_DISCONNECTED:常量值: 0 (0x00000000)

(2)SCAN(扫描状态值)
  • 扫描状态:
int SCAN_MODE_CONNECTABLE
指明在本地蓝牙适配器中,查询扫描功能失效,但页面扫描功能有效。因此该设备不能被远程蓝牙设备发现,但如果以前曾经发现过该设备,则远程设备可以对其进行连接。
常量值: 21 (0x00000015)
  • 可见状态:
int SCAN_MODE_CONNECTABLE_DISCOVERABLE
指明在本地蓝牙适配器中,查询扫描功能和页面扫描功能都有效。因此该设备既可以被远程蓝牙设备发现,也可以被其连接。
常量值: 23 (0x00000017)
  • 无功能状态:
int SCAN_MODE_NONE
    指明在本地蓝牙适配器中,查询扫描功能和页面扫描功能都失效因此该设备既不可以被远程蓝牙设备发现,也不可以被其连接。
    常量值: 20 (0x00000014)

(3)ACTION(广播)

接收的广播
  • 开始搜索:
String ACTION_DISCOVERY_STARTED
          广播事件:本地蓝牙适配器已经开始对远程设备的搜寻过程。
它通常会有一个大概需时12秒的查询扫描过程,紧跟着是一个对每个获取到自身蓝牙名称的新设备的页面扫描。用户会发现一个把ACTION_FOUND常量通知为远程蓝牙设备的注册。
设备查找是一个重量级过程。当查找正在进行的时候,用户不能尝试对新的远程蓝牙设备进行连接,同时存在的连接将获得有限制的带宽以及高等待时间。用户可用cancelDiscovery()类来取消正在执行的查找进程。
       需要 BLUETOOTH权限
常量值"android.bluetooth.adapter.action.DISCOVERY_STARTED"
  • 搜索完成:
String ACTION_DISCOVERY_FINISHED
广播事件:本地蓝牙适配器已经完成设备的搜寻过程。
需要 BLUETOOTH权限
常量值"android.bluetooth.adapter.action.DISCOVERY_FINISHED"
  •  蓝牙名称改变:
String ACTION_LOCAL_NAME_CHANGED
广播事件:本地蓝牙适配器已经更改了它的蓝牙名称。
该名称对远程蓝牙设备是可见的。它总是包含了一个带有名称的EXTRA_LOCAL_NAME附加域。
需要 BLUETOOTH权限
常量值"android.bluetooth.adapter.action.LOCAL_NAME_CHANGED"
  • 扫描模式变化:
String ACTION_SCAN_MODE_CHANGED
广播活动:指明蓝牙扫描模块或者本地适配器已经发生变化
它总是包含EXTRA_SCAN_MODEEXTRA_PREVIOUS_SCAN_MODE。这两个附加域各自包含了新的和旧的扫描模式。
需要 BLUETOOTH权限
常量值"android.bluetooth.adapter.action.SCAN_MODE_CHANGED"
  • 开关模式改变:
String ACTION_STATE_CHANGED
广播活动:本来的蓝牙适配器的状态已经改变。
例如:蓝牙模块已经被打开或者关闭。
它总是包含EXTRA_STATEEXTRA_PREVIOUS_STATE。这两个附加域各自包含了新的和旧的状态。
需要 BLUETOOTH权限
常量值"android.bluetooth.adapter.action.STATE_CHANGED"

请求的广播
  • 开启蓝牙:
String ACTION_REQUEST_ENABLE
Activity活动:显示一个允许用户打开蓝牙模块的系统活动。
当蓝牙模块完成打开工作,或者当用户决定不打开蓝牙模块时,系统活动将返回该值。
Android 运用onActivityResult(int, int, Intent)回收方法来传递该活动结果的通知。如果蓝牙模块被打开,将通过resultCode值RESULT_OK来显示;如果用户拒绝该请求,或者设备产生了错误,则通过RESULT_CANCELED值来显示。
      每当蓝牙模块被打开或者关闭,应用程序可以为通过ACTION_STATE_CHANGED值来监听全局的消息通知。
需要 BLUETOOTH权限
常量值"android.bluetooth.adapter.action.REQUEST_ENABLE"
  • 蓝牙可见:
String ACTION_REQUEST_DISCOVERABLE 
Activity活动:显示一个请求被搜寻模式的系统活动。如果蓝牙模块当前未打开,该活动也将请求用户打开蓝牙模块。
被搜寻模式和SCAN_MODE_CONNECTABLE_DISCOVERABLE等价。当远程设备执行查找进程的时候,它允许其发现该蓝牙适配器。
从隐私安全考虑,Android不会将被搜寻模式设置为默认状态。
该意图的发送者可以选择性地运用EXTRA_DISCOVERABLE_DURATION这个附加域去请求发现设备的持续时间。普遍来说,对于每一请求,默认的持续时间为120秒,最大值则可达到300秒。
Android 运用onActivityResult(int, int, Intent)回收方法来传递该活动结果的通知。被搜寻的时间(以秒为单位)将通过resultCode值来显示,如果用户拒绝被搜寻,或者设备产生了错 误,则通过RESULT_CANCELED值来显示。
每当扫描模式变化的时候,应用程序可以为通过ACTION_SCAN_MODE_CHANGED值来监听全局的消息通知。比如,当设备停止被搜寻以后,该消息可以被系统通知給应用程序。
需要 BLUETOOTH权限
常量值"android.bluetooth.adapter.action.REQUEST_DISCOVERABLE"

(4)EXTRA(附加域)
  • 扫描模式附加域:
     试图在ACTION_SCAN_MODE_CHANGED常量中作为一个整型附加域,来请求当前的扫描模式.可能值有:SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE
String EXTRA_SCAN_MODE
     常量值"android.bluetooth.adapter.extra.SCAN_MODE"
String EXTRA_PREVIOUS_SCAN_MODE
     常量值"android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE"
  • 开关状态附加域:
  试图在ACTION_STATE_CHANGED常量中作为一个整型附加域,来请求以前的供电状态。 可能值有:  STATE_OFF, STATE_ON, STATE_TURNING_OFF, STATE_TURNING_ON
String EXTRA_PREVIOUS_STATE
常量值"android.bluetooth.adapter.extra.PREVIOUS_STATE"
String EXTRA_STATE
    常量值"android.bluetooth.adapter.extra.STATE"
  • 蓝牙名称附加域:
String EXTRA_LOCAL_NAME
      试图在ACTION_LOCAL_NAME_CHANGED常量中作为一个字符串附加域,来请求本地蓝牙的名称。
      常量值"android.bluetooth.adapter.extra.LOCAL_NAME"
  • 可见时间附加域:
String EXTRA_DISCOVERABLE_DURATION
试图在ACTION_REQUEST_DISCOVERABLE常量中作为一个可选的整型附加域,来为短时间内的设备发现请求一个特定的持续时间。默认值为120秒,超过300秒的请求将被限制。这些值是可以变化的。
常量值"android.bluetooth.adapter.extra.DISCOVERABLE_DURATION"

3. 公共方法
  • 获取本地蓝牙适配器:
public static sychronized BluetoothAdapter getDefaultAdapter ()
       返回值:返回本地蓝牙适配器 BluetoothAdapter对象,如果蓝牙适配器在该硬件平台上不能被支持,则返回null
  • 获取蓝牙适配器当前状态:
public int getState ()
      返回值: 蓝牙适配器的当前状态,可能值有 STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF. 
      需要 BLUETOOTH权限
  • 检查蓝牙是否可用:
publci boolean isEnabled ()
   返回值: 如果蓝牙正处于打开状态并可用,则返回true,否则返回false
       需要 BLUETOOTH 权限
  • 打开蓝牙:
public boolean enable ()
      返回值 :如果蓝牙适配器的打开进程已经开启则返回true,如果产生错误则返回false
     需要BLUETOOTH_ADMIN权限。
  • 关闭蓝牙:
public boolean disable ()
      返回值:如果蓝牙适配器的停止进程已经开启则返回true,如果产生错误则返回false
   需要BLUETOOTH_ADMIN权限。
  • 蓝牙扫描:
传统蓝牙:
public  boolean startDiscovery ()
开始对远程设备进行查找的进程,先进行12秒的查询扫描过程,之后进行页面扫描。用户可用cencelDiscovery()类来取消扫描。
返回值:成功返回true,错误返回false
需要BLUETOOTH_ADMIN权限。
上面方法进行的扫描是对传统蓝牙的扫描,如果是扫描BLE(低功耗蓝牙),在API18之后添加了如下两个方法:

BLE(低功耗蓝牙):

1. public boolean startLeScan (UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)
This method was deprecated in API level 21.
use startScan(List, ScanSettings, ScanCallback) instead.
2.public boolean startLeScan (BluetoothAdapter.LeScanCallback callback)
This method was deprecated in API level 21.
use startScan(List, ScanSettings, ScanCallback) instead.
     开始扫描BLE(低功耗蓝牙)设备, 扫描结果使用onLeScan(BluetoothDevice, int, byte[]) 回调
     返回值:成功返回true,错误返回false
     需要BLUETOOTH_ADMIN权限。

在API 21之后,这两个方法被deprecated使用startScan(List, ScanSettings, ScanCallback) 替代
  • 蓝牙取消扫描:
传统蓝牙:

 public boolean cancelDiscovery ()
    取消蓝牙搜索,对蓝牙适配器而言,查找是一个重量级的过程,因此这个方法必须在尝试连接到远程设备前进行调用,即在进行connect()方法的时候, 必须调用这个方法
    返回值:成功则返回true,有错误则返回false
    需要BLUETOOTH_ADMIN权限。

BLE(低功耗蓝牙):
void stopLeScan (BluetoothAdapter.LeScanCallback callback)
This method was deprecated in API level 21.
Use stopScan(ScanCallback) instead.
      取消蓝牙搜索.结果使用onLeScan(BluetoothDevice, int, byte[]) 回调
    在API 21 使用 stopScan(ScanCallback) 替代
  • 是否在扫描中
boolean isDiscovering ()
    蓝牙是否处于正在搜索状态
     返回值:如果正在搜索,则返回true
  • 获取本地蓝牙地址:
String getAddress ()
    返回本地蓝牙适配器的硬件地址,例如: "00:11:22:AA:BB:CC"
     返回值:字符串形式的蓝牙模块地址
     需要BLUETOOTH权限。
  • 获取本地蓝牙名称:
String getName ()
    返回值:该蓝牙适配器名称,如果有错误则返回null    
     需要BLUETOOTH权限。
  • 获取绑定的设备集合:
Set<BluetoothDevice> getBondedDevices ()
    返回值:获取已经配对的设备的集合,如果有错误则返回null
    需要BLUETOOTH权限。
  • 获取扫描模式
int getScanMode ()
获取本地蓝牙适配器的当前蓝牙扫描模式
返回值:扫描模式
需要BLUETOOTH权限。
可能值有: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE.
  • 获取远程蓝牙设备
BluetoothDevice getRemoteDevice (byte[] address)
BluetoothDevice getRemoteDevice (String address)
        根据蓝牙的物理地址获取远程蓝牙设备
        参数:address 合法的蓝牙MAC地址
        异常:IllegalArgumentException      如果地址不合法
  • 检查蓝牙地址是否合法
boolean checkBluetoothAddress (String address)
      验证皆如"00:43:A8:23:10:F0"之类的蓝牙地址。字母必须为大写才有效。
       参数:address 字符串形式的蓝牙模块地址
       返回值:地址正确则返回true,否则返回false
  • 设置蓝牙名称
boolean setName (String name)
设置蓝牙或者本地蓝牙适配器的昵称.这个名字对于外界蓝牙设备而言是可见的。
需要BLUETOOTH_ADMIN权限。
参数:  name       一个合法的蓝牙名称
返回值:如果该名称已被设定,则返回true,否则返回false
  • 创建监听
BluetoothServerSocket listenUsingRfcommWithServiceRecord (String name, UUID uuid)
       创建一个监听Rfcommon端口的蓝牙监听, 使用accept()方法监听, 并获取BluetoothSocket对象; 该系统会根据一个服务名称(name)和唯一的识别码(uuid)来创建一个SDP服务, 远程蓝牙设备可以根据唯一的UUID来连接这个SDP服务器;
       参数 : name : SDP服务器名称, UUID, SDP记录下的UUID;
       返回值 : 正在监听蓝牙端口;
2 0
原创粉丝点击