这篇文章将会详细解析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. ios sdk的制作

    制作sdk的主要目的是将自己的code通过接口提供给其他应用使用.接下来介绍.a 静态库的制作注意事项: 1.首先.a文件的静态库要进行随时的测试,因此需要将其放入应用中(创建一个应用,再创建一个.a ...

  2. C++ 标准模板库(STL)

    C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...

  3. 【Cocos2D-x 3.5实战】坦克大战(1)环境配置

    前言: 最近课比较少,空闲时间比较多,一有时间就东想西想,想着想着就突然想到做手机游戏(android)了,学习下CoCos2d.看了一些CoCos2D的相关文档和教程,觉得是时候实战了,但是苦于没有 ...

  4. html5储存篇(二)

    indexedDB   相对于html5 中提到 web SQL Database,w3c已经明确声明放弃对其的继续支持,开始支持新的客户端数据库 indexedDB ,indexedDB 是一种no ...

  5. ASP.NET MVC 中的 T4

    每次使用“添加视图”或“添加控制器”功能时,您都在 ASP.NET MVC 项目中使用 T4 模板.这些模板位于 Common7\IDE\ItemTemplates\CSharp\Web\MVC 2\ ...

  6. ruby2.0(rails)以后版本的debug

    很喜欢RUBY(RAILS),认识也好久好久了,但是说实话,从来没用ROR写过什么东西,都是小打小闹,做些自娱自乐的东西,碰到什么问题,基本仔细看看,加上几个LOG就找到原因了,从来没想过要DEBUG ...

  7. javascript Error对象详解

    今天谈一下在IE浏览器下返回执行错误的Javascript代码所在的问题.其中在IE浏览器下,如果你使用了try-catch,那么当出现异常的时候,IE浏览器会传递一个Error对象. ~~~怎么通过 ...

  8. javascript 变量 命名规范 变量的作用域

    原文:javascript 变量 命名规范 变量的作用域 大家好,我是小强老师,今天讲解的是变量 变量 小时候我们学过  这个 应用题 :  X+1=2; 问  X 等于几?  答案是 1 对了,很聪 ...

  9. C#使用系统的“显示桌面”功能(Shell.Application)

    原文 C#使用系统的“显示桌面”功能(Shell.Application) 在 Windows 系统的 任务栏 上的 快速启动栏 里,通常有一个图标  ,点击这个图标,就会切换到桌面.这个图标实际是一 ...

  10. Spring Boot使用Redis进行消息的发布订阅

    今天来学习如何利用Spring Data对Redis的支持来实现消息的发布订阅机制.发布订阅是一种典型的异步通信模型,可以让消息的发布者和订阅者充分解耦.在我们的例子中,我们将使用StringRedi ...