一. BluetoothDevice简介

1. 继承关系

public static Class BluetoothDevice extends Object implement Parcelable

该类实现了Parcelable接口, 实现了Parcelable接口的类的对象可以封装到Parcel对象中, 封装后的数据可以通过Intent或者IPC传递;

实现Parcelable接口要点 :

a. 实现writeTpParcl()方法 : 将数据写入到Parcel对象中;

public void writeToParcel(Parcel out, int arg1)
{
     // TODO Auto-generated method stub
     out.writeBundle(this.mBundle);
}

b. 实现describeContents()方法 :

public int describeContents()
{
        // TODO Auto-generated method stub
        return 0;
}

c.实现Parcelable.Creator接口 :

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public TrainInfo createFromParcel(Parcel in)
        {
            SampleBean ti=new SampleBean();
            ti.mBundle=in.readBundle();
            return ti;
        }
        public SampleBean[] newArray(int size)
        {
            return new SampleBean[size];
        }
};

2. 该类简介

BluetoothDevice对象代表了一个远程的蓝牙设备, 通过这个类可以查询远程设备的物理地址, 名称, 连接状态等信息;

对这个类的操作, 会执行在远程蓝牙设备的硬件上.

对象获取途径 :

a. 调用BluetoothAdapter的getRemoteDevice(address)方法获取物理地址对应的该类对象;

b. 调用BluetoothAdapter的getBoundedDevices()方法, 可以获取已经配对的蓝牙设备集合;

3. 需要权限

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

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

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

二 API详解

1. 常量介绍

广播的小规律 : 根据广播的名称可以猜测广播的类型, 如果广播常量名称后面带着ED, 是过去时, 那么这个广播是需要注册接收的广播, 如ACTION_DISCOVERY_STARTED, 这是蓝牙设备开始搜索发出的广播;

如果广播常量名称不是ED结尾的, 那么这个是可以自己发送的广播, 例如蓝牙开启广播 : ACTION_REQUEST_ENABLE(蓝牙可用), ACTION_REQUEST_DISCOVERABLE(蓝牙可见);

低级连接与高级连接 : ACL连接是低级连接, RFCOMM, L2CAP等连接是高级连接; 高级别的连接基于低级别的连接;

(1)ACL连接相关广播常量

ACL连接 : 该连接是一种低级别的连接, ACL连接通过Android蓝牙栈自动进行管理;

String ACTION_ACL_CONNECTED : android.bluetooth.device.action.ACL_CONNECTED,与远程设备建立了ACL连接发出的广播, 包含EXTRA_DEVICE附加域, 该附加域中存放的是BluetoothDevice对象, 需要BLUETOOTH权限;

String ACTION_ACL_DISCONNECTED : android.bluetooth.device.action.ACL_DISCONNECTED,与远程设备断开ACL连接后发出的广播, 包含EXTRA_DEVICE附加域, 需要BLUETOOTH权限;

String ACTION_ACL_DISCONNECT_REQUESTED : android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED, 底层发出断开连接请求,ACL连接即将断开; 友好的断开连接时都会发出这个广播, 低级连接即将断开的时候, 应该马上中断高级连接; 需要BLUETOOTH权限;

(2)远程设备的其它广播常量

String ACTION_BOND_STATE_CHANGED : android.bluetooth.device.action.BOND_STATE_CHANGED, 远程蓝牙设备状态改变的时候发出这个广播, 例如设备被匹配, 或者解除配对; 该广播包含的附加域有 : EXTRA_DEVICE, EXTRA_BOND_STATE, EXTRA_BOND_PREVIOUS_STATE; 需要BLUETOOTH权限;

String ACTION_CLASS_CHANGED : android.bluetooth.device.action.CLASS_CHANGED, 一个远程设备的绑定状态发生改变时发出广播, 该广播附加域有 EXTRA_DEVICE, EXTRA_BOND_STATE; 需要BLUETOOTH权限;

String ACTION_FOUND : android.bluetooth.device.action.FOUND,发现一个远程设备的时候发出该广播; 这个广播总是包含EXTRA_DEVICE, EXTRA_CLASS附加域, 如果这个蓝牙可用的话, 还会包含EXTRA_NAME, EXTRA_RSSI附加域; 需要BLUETOOTH权限;

String ACTION_NAME_CHANGED : android.bluetooth.device.action.NAME_CHANGED,远程蓝牙设备的名称被发现改变 或者 第一次发现远程蓝牙设备的名称的时候发出该广播, 该广播包含附加域 EXTRA_DEVICE , EXTRA_NAME附加域; 需要BLUETOOTH权限;

(3)绑定状态常量

已绑定 : intBOND_BONDED , 值为12; 远程设备已经匹配; 本地存储了一个该远程设备的共享连接, 本地设备和远程设备之间的通信可以被认证和加密; 这个连接不是已经连接成功, 时刻保持连接状态, 这个连接的作用是, 下次连接的时候不用再次建立新的蓝牙连接;

绑定中 : intBOND_BONDING, 值为11; 本地设备与远程设备正在匹配中;

未匹配 : intBOND_NONE, 值为10; 本地设备与远程设备没有连接, 本地不存在与远程设备共享的连接, 设备间的通信不能被认证和加密;

(4)附加域常量

绑定状态 : StringEXTRA_BOND_STATE, int附加域, 值为android.bluetooth.device.extra.BOND_STATE, 这个附加域是ACTION_BOND_STATE_CHANGED的附加域, 可能的值为 BOND_BONDED, BOND_BONDING, BOND_NONE;

上一个绑定状态 : StringACTION_PREVIOUS_BOND_STATE, int附加域, 存放远程设备绑定状态, 值为"android.bluetooth.device.extra.PREVIOUS_BOND_STATE", 该附加域是ACTION_BOND_STATE_CHANGED广播的附加域;

BluetoothClass : StringEXTRA_CLASS, Parcelable BluetoothClass附加域, 存放BluetoothClass对象; 值为android.bluetooth.device.extra.CLASS, 这个附加域是ACTION_FOUND , ACTION_CLASS_CHANGED 广播的附加域;

BluetoothDevice : StringEXTRA_DEVICE, Parcelable BluetoothDevice附加域, 存放BluetoothDevice对象, 值为"android.bluetooth.device.extra.DEVICE",  几乎该类中的每个广播都有该附加域;

蓝牙名称 : StringEXTRA_NAME, 蓝牙名称附加域, 存放蓝牙名称, 值为"android.bluetooth.device.extra.NAME", 这个附加域是ACTION_NAME_CHANGED , ACTION_FOUND广播的附加域;

信号强度 : StringEXTRA_RSSI, 短整型附加域, 存放远程设备信号强度值; 值为"android.bluetooth.device.extra.NAME";

2. 公共方法介绍

(1)封装到Parcel方法

public void writeToParcel (Parcel out, int flags)

作用 : 将对象写出到Parcel对象中, 这是实现的Parcelable接口的方法

参数 : out , 要封装到的目的对象; flags , 对象如何被写入的附加标志;

(2)描述内容

public int describeContents ()

作用 : 实现Parcelable接口;

(2)建立BluetoothSocket连接

public BluetoothSocket createRfcommSocketToServiceRecord (UUID uuid)

作用 : 创建BluetoothSocket连接对象, 该方法创建的BluetoothSocket连接对象与 BluetoothAdapter的listenUsingRfcommWithServiceRecord方法创建的BluetoothServerSocket连接是对应的, 调用BluetoothSocket对象的connect()方法创建一个连接, 通过UUID执行对应信道的SDP查找动作;

如果两个安卓手机之间进行连接需要生成专用的UUID, 如果是对蓝牙串口进行连接, 就使用总所周知的SPP UUID 00001101-0000-1000-8000-00805F9B34FB


参数 : 用来识别远程蓝牙设备的UUID, 该UUID用来查询RFCOMM通道的服务记录;

返回值 : 创建的BluetoothSocket连接对象

(3)比较方法

public boolean equals (Object o)

作用 : 比较调用该方法的对象与 o 对象, 如果相等, 返回true, 反之返回false;

参数 : 对比的对象

返回值 : 如果两个对象相等, 返回true, 反之返回false;

(4)获取蓝牙地址

public String getAddress ()

作用 : 返回设备的蓝牙地址, 这个蓝牙地址是17位的, 并且字母都是大写字母;

(5)获取蓝牙类

public BluetoothClass getBluetoothClass ()

作用 : 获取远程设备的蓝牙类, 需要BLUETOOTH权限, 如果出现错误, 返回null;

(6)获取设备的绑定状态

public int getBondState ()

作用 : 获取远程设备的状态, 可能会是BOND_BONDED, BOND_BONDING, BOND_NONE中的一个;

(7)获取设备的蓝牙名称

public String getName ()

作用 : 获取远程的蓝牙设备名称

(8)获取哈希值

public int hashCode ()

作用 : 获取哈希值, 可以重写这个方法

(9)字符串方法

public int hashCode ()

作用 : 默认情况下返回的蓝牙的物理地址;

,

,

,

【Android 应用开发】BluetoothDevice详解的更多相关文章

  1. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  2. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  3. Cordova 打包 Android release app 过程详解

    Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...

  4. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  5. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  6. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

  7. Android:TextView跑马灯-详解

    Android:TextView跑马灯_详解 引言: TextView之所以需要跑马灯,是由于文字太长,或者是吸引眼球. 关键代码如下: android:singleLine="true&q ...

  8. Android的init过程详解(一)

    Android的init过程详解(一) Android的init过程(二):初始化语言(init.rc)解析 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几 ...

  9. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github. ...

  10. Android开发之MdiaPlayer详解

    Android开发之MdiaPlayer详解 MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在<Android开发之基于Service的音乐播放器>一文中介绍过它的使用. ...

随机推荐

  1. activiti bpmnModel使用

    bpmnModel对象,是activiti动态部署钟很重要的一个对象,如果bpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,就显得力不从心,之前我们公司自己开发了一套acti ...

  2. [openresty]安装nginx_lua

    这种方式是直接安装openresty ,不是通过重新编译nginx Ubuntu 安装 安装依赖包 $ sudo apt-get install libreadline-dev libncurses5 ...

  3. 悲观的并发策略——Synchronized互斥锁

    volatile既然不足以保证数据同步,那么就必须要引入锁来确保.互斥锁是最常见的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它保证共享数据同一时刻只能被一条线程使用,其他线程只有等到锁 ...

  4. Jstorm与RocketMQ整合

    如果是经常关注阿里巴巴的朋友们,看到我这篇博客的题目,就知道我在参加今年的中间件比赛. 好了,废话不说,开始了. 首先我们知道,rocketmq的consumer有两种,一种是DefaultMQPus ...

  5. (一二〇)CALayer的一些特性

    1.每个View都自带一个CALayer,称为rootLayer,layer可以和实现与View一样的显示功能,但是它不继承UIResponse,也就是说它无法处理事件,所以为了处理事件还是要用Vie ...

  6. UNIX环境高级编程——实现uid to name

    setpwent()用来将getpwent()的读写地址指回文件开头,即从头读取密码文件中的账号数据. strcut passwd * getpwent(void); getpwent()用来从密码文 ...

  7. jQuery Ajax 使用 ($.ajax、$.post、$.get)

    项目中只要涉及到前后台的交互,数据状态之间的交互,ajax是必不可少的.一般项目中jquery方式的ajax用的还是比较多的.封装的比较好,用起来也顺手,兼容浏览器之间的差异. 操作的方式有三种: 1 ...

  8. 【java集合框架源码剖析系列】java源码剖析之TreeMap

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于TreeMap的知识. 一TreeMap的定义: public class TreeMap&l ...

  9. scala学习笔记4(apply方法)

    class ApplyTest{ def apply() = "This apply is in class" def test{ println("test" ...

  10. Tomcat性能优化及常用命令整理

    1汤姆猫性能优化 1.1连接参数 1.1.1默认连接配置 默认连接器采用阻塞式 IO,默认最大线程数为200,配置如下: <Connector port="8080" pro ...