安卓蓝牙技术之BluetoothAdapter

  • Post author:
  • Post category:其他


BluetoothAdapter

代表了移动设备的本地的蓝牙适配器


,


通过该蓝牙适配器可以对蓝牙进行基本操作


,


例如


:


启动设备发现


(startDiscovery),


获取已配对设备


(getBoundedDevices),


通过


mac


蓝牙地址获取蓝牙设备


(getRemoteDevice),


从其它设备创建一个监听连接


(listenUsingRfcommWithServiceRecord);BluetoothAdapter.getDefaultAdapter()


该静态方法可以获取该适配器对象


.



API

详解



1.

常量介绍

(1)

开关状态值


蓝牙关闭

: int STATE_OFF ,

值为


10,


蓝牙模块处于关闭状态


;


蓝牙打开中

: int STATE_TURNING_ON ,

值为


11,


蓝牙模块正在打开


;


蓝牙开启

: int STATE_ON ,

值为


12,


蓝牙模块处于开启状态


;


蓝牙开启中

: int STATE_TURNING_OFF ,

值为


13,


蓝牙模块正在关闭


;


蓝牙开关状态顺序

: STATE_OFF –> STATE_TURNING_ON –> STATE_ON –> STATE_TURNING_OFF –> STATE_OFF;

(2)

扫描状态值


无功能状态

: int SCAN_MODE_NONE ,

值为


20,


查询扫描和页面扫描都失效


,


该状态下蓝牙模块既不能扫描其它设备


,


也不可见


;


扫描状态

: int SCAN_MODE_CONNECTABLE ,

值为


21,


查询扫描失效


,


页面扫描有效


,


该状态下蓝牙模块可以扫描其它设备


,


从可见性来说只对已配对的蓝牙设备可见


,


只有配对的设备才能主动连接本设备


;


可见状态

: int SCAN_MODE_CONNECTABLE_DISCOVERABLE,

值为


23,


查询扫描和页面扫描都有效


;


查询扫描功能

:

其它设备可以扫描到本设备


,


指的是可见性可见


;


页面扫描功能

:

可以主动扫描其它设备


;

(3)

蓝牙操作接收的广播


开始搜索广播

: String ACTION_DISCOVERY_STARTED,

蓝牙适配器开始搜索远程设备


,


值为


“android.bluetooth.action.DISCOVERY_START”,


蓝牙适配器开始搜索之后


,


会先有


12


秒的查询扫描


(12s


内可见


),


查询扫描后进行页面扫描


(


主动搜索


),


需要


BLUETOOTH


权限


;


如果搜索到蓝牙设备

,

就会收到


BluetoothDevice.ACTION_FOUND


广播


,


可以从


Intent


中获取放在其中的


BluetoothDevice


对象


, intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);


设备查找非常消耗资源

,

在查找的过程中


,


不能连接远程的蓝牙设备


,


已经存在的连接也要限制带宽


,


如果想要执行除查找外的其它操作


,


之前最好调用


cancelDiscovery();


搜索完成广播

: String ACTION_DISCOVERY_FINISHED,

蓝牙


S


适配器完成搜索发出的广播


,


值为


“android.bluetooth.adapter.action.DISCOVERY_FINISHED”,


需要


BLUETOOTH


权限


;


蓝牙名称改变广播

: String ACTION_LOCAL_NAME_CHANGED,

本地的蓝牙适配器改变了自己的名称


,


值为


“android.bluetooth.adapter.action.LOCAL_NAME_CHANGED”,


注意改变的是本设备名称


,


不是远程设备的


.


这个广播包含一个


EXTRA_LOCAL_NAME


附加域


,


需要


BLUETOOTH


权限


;


扫描模式变化广播


: String ACTION_SCAN_MODE_CHANGED,


蓝牙模块扫描模式发生了变化


,


值为


“android.bluetooth.adapter.action.SCAN_MODE_CHANGED”,





Intent


对象包含了


EXTRA_SCAN_MODE





EXTRA_PREVIOUS_SCAN_MODE,


两个附加域分别是新的和旧的扫描模式


,


这里可以根据前后扫描模式的不同做出不同的操作


,


需要


BLUETOOTH


权限


;


开关模式变化广播

: String ACTION_STATE_CHANGED,

蓝牙模块被打开或者关闭


,


值为


“android.bluetooth.adapter.action.STATE_CHANGED”,


该广播的


Intent


中包含


EXTRA_STATE





EXTRA_PREVIOUS_STATE


两个附加域


,


需要


BLUETOOTH


权限


;

(4)

蓝牙操作请求的广播


开启蓝牙

:String ACTION_REQUEST_ENABLE,


打开蓝牙

,

值为


“android.bluetooth.adapter.action.REQUEST_ENABLE”,

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent, requestCode);

可以在


Activity


中的


onActivityResult()


方法中处理结果


,


如果蓝牙模块打开成功


,


则返回结果吗


RESULT_OK;


如果蓝牙模块打开失败


,


则返回结果码


RESULT_CANCELED;


打开和关闭蓝牙模块

,

都可以通过


ACTION_STATE_CHANGED


广播来监听


;


蓝牙可见

: String ACTION_REQUEST_DISCOVERABLE,

使蓝牙可见


,


值为

“android.bluetooth.adapter.action.REQUEST_DISCOVERABLE”,

默认的可见时间为


120s,


可以在广播中添加附加域


,


设置任意的可见时间


,


附加域为


EXTRA_DISCOVERABLE_DURATION,


需要


BLUETOOTH


权限


;


可以在

Activity

中的


onActivityResult()


方法中处理结果


,


如果蓝牙模块设置可见成功


,


则返回结果吗


RESULT_OK;


如果蓝牙模块设置可见失败


,


则返回结果码


RESULT_CANCELED;

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);

startActivityForResult(discoverableIntent,resultCode)

(5)

附加域


附加域是放在

Intent

中的


,


使用


Intent.putExtra(


附加域


,


附加值


)


方法添加附加域


;


扫描模式附加域

:

这两个附加域的值是扫描模式


,


可以为


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”;


开关状态附加域

:

这两个附加域的值是开关状态


,


可以为

STATE_OFF, STATE_ON, STATE_TURNING_OFF, STATE_TURNING_ON;

String EXTRA_STATE :

值为


“android.bluetooth.adapter.extra.STATE”;

String EXTRA_PREVIOUS_STATE :

值为


“android.bluetooth.adapter.extra.PREVIOUS_STATE”;


蓝牙名称附加域

: String EXTRA_LOCAL_NAME ,

存放


ACTION_LOCAL_NAME_CHANGED


附加域的附加值


,


值为


“android.bluetooth.adapter.extra.LOCAL_NAME”;


可见时间附加域

: String EXTRA_DISCOVERABLE_DURATION,

存放的是


ACTION_REQUEST_DISCOVERABLE


广播的可见时长


,


值为

“android.bluetooth.adapter.extra.DISCOVERABLE_DURATION”;

(6)

错误码

int ERROR ,

这个值用来标记错误


,


方便自己使用的


,


没有实际意义


;


2.State

状态相关方法

(1)

获取蓝牙适配器

public static sychronized BluetoothAdapter getDefaultAdapter();


返回值

:

本地蓝牙适配器


BluetoothAdapter


对象


;

(2)

获取


state


状态方法

public int getState();


作用

:

获取是否可用


返回值

:

返回当前的


State


状态值


, STATE_ON, STATE_OFF, STATE_TURNING_ON, STATE_TURNING_OFF;


权限

: BLUETOOTH;

(3)

蓝牙是否可用

public boolean isEnable();


作用

:

获取当前设备蓝牙模块是否可用


;


返回值

:

返回当前蓝牙模块是否可用


, true


可用


, false


不可用


;


权限

: BLUETOOTH

权限


;

(4)

打开蓝牙

public boolean enable();


作用

:

打开本地蓝牙适配器


;


返回值

:

如果打开成功则返回


true,


如果打开失败返回


false;


权限

:

BLUETOOTH_ADMIN


权限


;

(5)

关闭蓝牙

public boolean disable();


作用

:

关闭本地设备蓝牙


;


返回值

:

如果关闭蓝牙成功


,


返回


true;


如果关闭蓝牙失败


,


返回


false;


权限

: BLUETOOTH_ADMIN

权限


;


3.

扫描相关方法

(1)

开始扫描

public boolean startDiscovery();


作用

:

开始查找远程蓝牙设备


,


先进行


12


秒的查询扫描


(


被动可见


),


之后进行页面扫描


(


主动搜索


);


搜索过成功不能尝试对远程设备的连接


,


同时已连接的设备的带宽也会被压缩


,


等待时间变长


;


使用


cancelDiscovery()


可以终止搜索


;


返回值

:

如果成功则返回


true,


失败返回


false;


权限

:

BLUETOOTH_ADMIN

权限


;

(2)

是否在扫描中

public boolean isDiscovering();


作用

:

是否正在搜索


;


返回值

:

如果设备正在搜索


,


返回


true;


如果设备没有进行蓝牙搜索


,


返回


false;


权限

: BLUETOOTH

权限


;

(3)

取消查找

public boolean cancelDiscovery();


作用

:

取消蓝牙搜索


;


在进行


connect()


方法的时候


,


必须调用这个方法


,


蓝牙搜索是一个服务进行


,


在搜索中的时候


,


不能进行连接


;


返回值

:

如果取消成功


,


则返回


true;


如果取消失败


,


返回


false;

(4)

获取扫描模式

public int getScanMode();


作用

:

获取当前蓝牙的扫描模式


;


返回值

: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;


4.

与蓝牙设备相关的方法

(1)

检查蓝牙地址是否有效

public boolean checkBluetoothAddress(String address);


作用

:

检查蓝牙地址是否合法


,


蓝牙地址字母必须大写


,


例如


: “00:43:A8:23:10:F0”;


参数

: 17

位的字符串


,


例如


: “00:43:A8:23:10:F0”;


返回值

:

如果蓝牙地址合法返回


true,


反之返回


false;

(2)

获取本地蓝牙地址

public String getAddress();


作用

:

返回本地蓝牙的


MAC


地址


;


返回值

:

本地的硬件地址


;

(3)

获取本地蓝牙名称

public String getName();


返回值

:

本地蓝牙设备的名称


;

(4)

获取绑定的蓝牙集合

public Set<BluetoothDevice> getBoundedDevices();


作用

:

获取已经配对的蓝牙设备的集合


,


如果蓝牙未被打开


,


则返回


null;

(5)

获取远程蓝牙设备

public BluetoothDevice getRemoteDevice(String address);


作用

:

根据蓝牙的物理地址获取远程的蓝牙设备


,


如果地址不合法


,


就会产生异常


;


返回值

:

获取到的


BluetoothDevice


对象


;

(6)

创建监听

Public  BluetoothServerSocket  listenUsingRfcommonWithServiceRecord(String name, UUID uuid);


作用

:

创建一个监听


Rfcommon


端口的蓝牙监听


,


使用


accept()


方法监听


,


并获取


BluetoothSocket


对象


;


该系统会根据一个服务名称


(name)


和唯一的识别码


(uuid)


来创建一个


SDP


服务


,


远程蓝牙设备可以根据唯一的


UUID


来连接这个


SDP


服务器


;


参数

: name : SDP

服务器名称


, UUID, SDP


记录下的


UUID;


返回值

:

正在监听蓝牙端口


;


权限

: BLUETOOTH;

(7)public Boolean setName(String name)

作用:设置蓝牙的名称。


5.

常用用法

1.

打开蓝牙


第一种打开方法:调用


enable


即可


booleanresult = mBluetoothAdapter.enable();


第二种打开方法


,调用系统

API

去打开蓝牙


if(!mBluetoothAdapter.isEnabled()) //

未打开蓝牙,才需要打开蓝牙


{

Intent intent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent, REQUEST_OPEN_BT_CODE);


会以

Dialog

样式显示一个


Activity


, 我们可以在


onActivityResult()


方法去处理返回值


}


第一种方法打开蓝牙

,

没有任何提示


,


直接就打开了


;


第二种方法发送广播

,

会弹出一个对话框


,


选择是否打开蓝牙


,


选择是蓝牙才打开


;

2.

设置可见

private void setDiscoverable() {

Intent bluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

bluetoothIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600);

mContext.startActivity(bluetoothIntent);

}


发送

ACTION_REQUEST_DISCOVERABLE

广播


,


同时在


EXTRA_DISCOVERABLE_DURATION


附加域中加入可见时间


,


单位是秒


;


发送这个广播

,

会弹出一个对话框


,


显示是否可见


3600





;



版权声明:本文为xxdw1992原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。