详细解析BluetoothAdapter

一 BluetoothAdapter简介android


1.继承关系服务器

该类仅继承了Object类;ui


2.该类做用对象


BluetoothAdapter表明了移动设备的本地的蓝牙适配器, 经过该蓝牙适配器能够对蓝牙进行基本操做, 例如 : 启动设备发现(startDiscovery), 获取已配对设备(getBoundedDevices), 经过mac蓝牙地址获取蓝牙设备(getRemoteDevice), 从其它设备建立一个监听链接(listenUsingRfcommWithServiceRecord);继承




BluetoothAdapter.getDefaultAdapter()该静态方法能够获取该适配器对象.资源




3.蓝牙权限字符串

Android.permission.BLUETOOTH : 容许程序链接到已配对的蓝牙设备, 请求链接/接收链接/传输数据须要改权限, 主要用于对配对后进行操做;get


android.permission.BLUETOOTH_ADMIN : 容许程序发现和配对蓝牙设备, 该权限用来管理蓝牙设备, 有了这个权限, 应用才能使用本机的蓝牙设备, 主要用于对配对前的操做;it


优先级 : BLUETOOTH权限是BLUETOOTH_ADMIN权限的前提, 若是没有BLUETOOTH权限, 就不能使用BLUETOOTH_ADMIN权限;io




二 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", 


1

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

2

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;


1

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

2

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);

3

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)获取蓝牙适配器

1

public static sychronized BluetoothAdapter getDefaultAdapter();

返回值 : 本地蓝牙适配器 BluetoothAdapter对象;




(2)获取state状态方法

1

public int getState();

做用 : 获取是否可用


返回值 : 返回当前的State状态值, STATE_ON, STATE_OFF, STATE_TURNING_ON, STATE_TURNING_OFF;


权限 : BLUETOOTH;




(3)蓝牙是否可用

1

public boolean isEnable();

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


返回值 : 返回当前蓝牙模块是否可用, true 可用, false 不可用;


权限 : BLUETOOTH权限;




(4)打开蓝牙

1

public boolean enable();

做用 : 打开本地蓝牙适配器;


返回值 : 若是打开成功则返回true, 若是打开失败返回false;


权限 : BLUETOOTH_ADMIN权限;




(5)关闭蓝牙

1

public boolean disable();

做用 : 关闭本地设备蓝牙;


返回值 : 若是关闭蓝牙成功, 返回true; 若是关闭蓝牙失败, 返回false;


权限 : BLUETOOTH_ADMIN权限;




3. 扫描相关方法



(1)开始扫描

1

public boolean startDiscovery();

做用 : 开始查找远程蓝牙设备, 先进行12秒的查询扫描(被动可见), 以后进行页面扫描(主动搜索); 搜索过成功不能尝试对远程设备的链接, 同时已链接的设备的带宽也会被压缩, 等待时间变长; 使用cancelDiscovery()能够终止搜索;


返回值 : 若是成功则返回true, 失败返回false;


权限 : 

 BLUETOOTH_ADMIN权限;




(2)是否在扫描中

1

public boolean isDiscovering();

做用 : 是否正在搜索;


返回值 : 若是设备正在搜索, 返回true; 若是设备没有进行蓝牙搜索, 返回false;


权限 : BLUETOOTH权限;




(3)取消查找

1

public boolean cancelDiscovery();

做用 : 取消蓝牙搜索; 在进行connect()方法的时候, 必须调用这个方法, 蓝牙搜索是一个服务进行, 在搜索中的时候, 不能进行链接;


返回值 : 若是取消成功, 则返回true; 若是取消失败, 返回false;


 




(4)获取扫描模式

1

public int getScanMode();

做用 : 获取当前蓝牙的扫描模式;


返回值 : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;




 


4.与蓝牙设备相关的方法

(1)检查蓝牙地址

1

public boolean checkBluetoothAddress(String address);

做用 : 检查蓝牙地址是否合法, 蓝牙地址字母必须大写, 例如 : "00:43:A8:23:10:F0";


参数 : 17位的字符串, 例如 : "00:43:A8:23:10:F0";


返回值 : 若是蓝牙地址合法返回true, 反之返回false;




(2)获取本地蓝牙地址

1

public String getAddress();

做用 : 返回本地蓝牙的MAC地址;


返回值 : 本地的硬件地址;




(3)获取本地蓝牙名称

1

public String getName();

返回值 : 本地蓝牙设备的名称;




(4)获取绑定的蓝牙集合

1

public Set<BluetoothDevice> getBoundedDevices();

做用 : 获取已经配对的蓝牙设备的集合, 若是蓝牙未被打开, 则返回null;


 


(5)获取远程蓝牙设备

1

public BluetoothDevice getRemoteDevice(String address);

做用 : 根据蓝牙的物理地址获取远程的蓝牙设备, 若是地址不合法, 就会产生异常;


返回值 : 获取到的BluetoothDevice对象;




(6)建立监听

1

publicBluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);

做用 : 建立一个监听Rfcommon端口的蓝牙监听, 使用accept()方法监听, 并获取BluetoothSocket对象; 该系统会根据一个服务名称(name)和惟一的识别码(uuid)来建立一个SDP服务, 远程蓝牙设备能够根据惟一的UUID来链接这个SDP服务器;


参数 : name : SDP服务器名称, UUID, SDP记录下的UUID;


返回值 : 正在监听蓝牙端口;


权限 : BLUETOOTH;




 


三 经常使用用法

 


1.打开蓝牙

01

    //第一种打开方法: 调用enable 便可 

02

booleanresult = mBluetoothAdapter.enable(); 

03

   

04

// 

05

/第二种打开方法 ,调用系统API去打开蓝牙 

06

if(!mBluetoothAdapter.isEnabled()) //未打开蓝牙,才须要打开蓝牙 

07

08

Intent intent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 

09

startActivityForResult(intent, REQUEST_OPEN_BT_CODE); 

10

//会以Dialog样式显示一个Activity , 咱们能够在onActivityResult()方法去处理返回值 

11

}第一种方法打开蓝牙, 没有任何提示, 直接就打开了;

第二种方法发送广播, 会弹出一个对话框, 选择是否打开蓝牙, 选择是蓝牙才打开;




2.设置可见

1

private void setDiscoverable() {

2

    Intent bluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

3

    bluetoothIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600);

4

    mContext.startActivity(bluetoothIntent);

5

}

发送ACTION_REQUEST_DISCOVERABLE广播, 同时在EXTRA_DISCOVERABLE_DURATION附加域中加入可见时间, 单位是秒;

发送这个广播, 会弹出一个对话框, 显示是否可见3600秒;

相关文章
相关标签/搜索