一. 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 ()

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

,

,

,

作者:han1202012 发表于2013-11-4 18:03:09 原文链接
阅读:75 评论:1 查看评论

安卓程序代写 网上程序代写[原]BluetoothDevice详解的更多相关文章

  1. (转)iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    原文:http://blog.csdn.net/totogo2010/article/details/8048652 iOS应用程序生命周期(前后台切换,应用的各种状态)详解         分类:  ...

  2. 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务anima ...

  3. [转载,感觉写的非常详细]DUBBO配置方式详解

    [转载,感觉写的非常详细]DUBBO配置方式详解 原文链接:http://www.cnblogs.com/chanshuyi/p/5144288.html DUBBO 是一个分布式服务框架,致力于提供 ...

  4. 安卓程序代写 网上程序代写[原]BluetoothAdapter解析

    这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每个常量含义. 一 BluetoothAdapter简介 1.继承关系 该类仅继承了Object类; 2.该类作用 ...

  5. 安卓程序代写 网上程序代写[转]SVN 在线代码托管工具

    本文转载自 : http://blog.csdn.net/ithomer/article/details/8142920  作者:阳光岛主 在互联网环境使用SVN服务,你必须要有一台在互联网环境内支持 ...

  6. 小程序2-基本架构讲解(一)JSON配置与详解

    项目里边生成了不同类型的文件: .json 后缀的 JSON 配置文件 .wxml 后缀的 WXML 模板文件 .wxss 后缀的 WXSS 样式文件 .js 后缀的 JS 脚本逻辑文件 JSON 配 ...

  7. 微信小程序开发教程(八)视图层——.wxml详解

    框架的视图层由WXMKL(WeiXin Markup language)与WXSS(WeiXin Style Sheet)编写,由组件进行展示. 对于微信小程序而言,视图层就是所有.wxml文件与.w ...

  8. 写给大忙人的nginx核心配置详解

    由于当前很多应该都是前后端分离了,同时大量的基于http的分布式和微服务架构,使得很多时候应用和不同项目组之间的系统相互来回调用,关系复杂.如果使用传统的做法,都在应用中进行各种处理和判断,不仅维护复 ...

  9. 微信小程序开发教程(七)逻辑层——.js详解

    逻辑层,是事务逻辑处理的地方.对于小程序而言,逻辑层就是.js脚本文件的集合.逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈. 微信小程序开发框架的逻辑层是由JavaScript编写.在 ...

随机推荐

  1. 【小超_Android】2015最流行的android组件、工具、框架大全(兴许)

    2015.07.07 FlyRefresh 创意Replace的Android实现,非常cool. fab-toolbar Material Design风格的FAB工具栏效果 MaterialVie ...

  2. CentOS 7 安装开发者环境

    在vagrant box中安装了基本的centos7的box,但是,该环境没有安装编译软件,所以要求自行安装. 1.查看群组安装的源包数量: yum group list ,搜索Development ...

  3. vim常忘命令

    1.复制指定行到当前光标的下一行. #假设当前光标在10行,想把第5行复制到第11行 :5copy. #copy命令有2种简写'co'和't',所以也可以写成下面的格式 :5co. :5t. 参考:h ...

  4. ES monitoring

    https://www.quora.com/What-is-the-best-monitoring-tool-for-Elasticsearch-I-also-want-log-monitoring- ...

  5. 把虚拟教练带回家,「EuMotus」想用AI实现高精度运动反馈系统

    https://36kr.com/p/5089139.html 无需穿戴设备,只需一个红外摄像头和+已安装好EuMotus专利软件的手提电脑 由政府主导的高达2200亿美金的健身与运动支出,15%的健 ...

  6. 如何理解java泛型类

    //泛型代码 public class Pair<T>{ private T first=null; private T second=null; public Pair(T fir,T  ...

  7. (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决

    boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的.但是在使用过程中却发现各 ...

  8. 每日英语:The Toy Mogul Who Became A Billionaire Through His Fight To The Death With Barbie

    The trophy case in the tiny conference room outside Isaac Larian’s corner office spans an entire wal ...

  9. wireshark in ubuntu

    安装 sudo apt-get install wiresharksudo dpkg-reconfigure wireshark-commonsudo usermod -a -G wireshark ...

  10. DIOCP开源项目-Delphi高性能无锁队列(lock-free)

    最近想在DIOCP中加入任务调度线程,DIOCP的工作线程作为生产者(producer)将接受到的数据对象,投递到任务调度线程中,然后统一进行分配.然而这一切都需要一个队列, 这几天都在关注无锁队列. ...