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