这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每个常量含义.

一 BluetoothAdapter简介

 

1.继承关系

该类仅继承了Object类;
 

2.该类作用

 

BluetoothAdapter代表了移动设备的本地的蓝牙适配器, 通过该蓝牙适配器可以对蓝牙进行基本操作, 例如 : 启动设备发现(startDiscovery), 获取已配对设备(getBoundedDevices), 通过mac蓝牙地址获取蓝牙设备(getRemoteDevice), 从其它设备创建一个监听连接(listenUsingRfcommWithServiceRecord);

BluetoothAdapter.getDefaultAdapter()该静态方法可以获取该适配器对象.

3.蓝牙权限

android.permission.BLUETOOTH : 允许程序连接到已配对的蓝牙设备, 请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作;

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

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

二 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
2
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;

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

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
public BluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);

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

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

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

权限 : BLUETOOTH;

三 常用用法

1.打开蓝牙

1
2
3
4
5
6
7
8
9
10
11
    //第一种打开方法: 调用enable 即可 
boolean result = mBluetoothAdapter.enable(); 
   
// 
/第二种打开方法 ,调用系统API去打开蓝牙 
if (!mBluetoothAdapter.isEnabled()) //未打开蓝牙,才需要打开蓝牙 
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
startActivityForResult(intent, REQUEST_OPEN_BT_CODE); 
//会以Dialog样式显示一个Activity , 我们可以在onActivityResult()方法去处理返回值 
}

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

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

2.设置可见

1
2
3
4
5
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秒;

详细解析BluetoothAdapter的详细api的更多相关文章

  1. java类生命周期详细解析

    (一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前 ...

  2. ZT Linux系统环境下的Socket编程详细解析

    Linux系统环境下的Socket编程详细解析 来自: http://blog.163.com/jiangh_1982/blog/static/121950520082881457775/ 什么是So ...

  3. 目标检测从入门到精通—R-CNN详细解析(二)

    R-CNN目标检测详细解析 <Rich feature hierarchies for Accurate Object Detection and Segmentation> Author ...

  4. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  5. include_path详细解析

    include_path详细解析     原文地址:http://www.laruence.com/2010/05/04/1450.html 1.php默认的包含路径为 .;C:\php\pear 即 ...

  6. Intent的详细解析以及用法

    Intent的详细解析以及用法      Android的四大组件分别为Activity .Service.BroadcastReceiver(广播接收器).ContentProvider(内容提供者 ...

  7. C++多态的实现及原理详细解析

    C++多态的实现及原理详细解析 作者: 字体:[增加 减小] 类型:转载   C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型 ...

  8. 对MySQL DELETE语法的详细解析

    以下的文章主要描述的是MySQL DELETE语法的详细解析,首先我们是从单表语法与多表语法的示例开始的,假如你对MySQL DELETE语法的相关内容十分感兴趣的话,你就可以浏览以下的文章对其有个更 ...

  9. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

随机推荐

  1. 浅谈JDBC(二)

    JDBC中的事务 简单来说,事务就是要保证一组DAO方法的操作,要么一起成功要么一起失败. 1.事务控制的位置 在Service中的业务方法内进行事务控制. 2.事务控制的代码 a.注意:JDBC会自 ...

  2. [置顶] 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……

    两台主机A.B搭建mysql主从复制关系(A为master,B为slave)后,在slave上执行show slave status,结果中显示Last_IO_Error: error connect ...

  3. python的map()函数

    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于list [1, 2 ...

  4. COM编程之IUnknown接口

    COM组件其实是一种特殊的类,遵循一个统一的标准,使到各个软件都可以通过某种方法访问这个类的函数和方法,也就可以做到组件通用. com就是统一的标准--通过接口来调用com组件.接口是你的com组件能 ...

  5. USACO 2001 OPEN

    第1题 绿组. 奶牛接力赛[relay] 题目描述 农夫约翰已经为一次赛跑选出了K(2≤K≤40)头牛组成了一支接力队.赛跑在农夫约翰所拥有的农场上进行,农场的编号为1到Ⅳf4≤Ⅳ< 800), ...

  6. poj 1144 Network(割点)

    题目链接: http://poj.org/problem?id=1144 思路分析:该问题要求求出无向联通图中的割点数目,使用Tarjan算法即可求出无向联通图中的所有的割点,算法复杂度为O(|V| ...

  7. Java发送HTTP POST请求(内容为xml格式)

    今天在给平台用户提供http简单接口的时候,顺便写了个调用的Java类供他参考.      服务器地址:http://5.0.217.50:17001/VideoSend 服务器提供的是xml格式的h ...

  8. Delete website with command.

    1.AppCmd.exe 2.http://www.windowsnetworking.com/articles-tutorials/windows-server-2008/Configuring-I ...

  9. SSIS CDC(Change Data Capture)组件在数据库中启用报错。 The error returned was 14234: 'The specified '@server' is invalid

    昨天实验CDC,在数据库中执行以下语句的时候出错. EXEC sys.sp_cdc_enable_table @source_schema = N'stg', @source_name = N'CDC ...

  10. AIX LVM学习笔记

    LVM: LOGIC VOLUMN MANAGEMENT (逻辑卷管理器) 通过将数据在存储空间的 逻辑视图 与 实际的物理磁盘 之间进行映射,来控制磁盘资源.实现方式是在传统的物理设备驱动层之上加载 ...