天气逐渐热了,自己也越来越懒了,虽然看着了很多东西,解决了很多问题,有些收获却不想写着。主要有一下两方面原因:

第一、以前写的一些关于Android知识的Blog,都是在学习过程中发现网络上没有相关知识,因此下了很大决心,才一步

一步码字儿给贴出来。承蒙各位网友的厚爱,本博客还是有些底子的。

第二、最近的工作态度发生了改变,不在像那么以前充满热情,充满力量,就着问题解决问题,自己都有点耐烦了。心里

寻思着,也许是该改变些什么了吧。

新的手机项目,又开始从事之前的Settings模块了,现在看看Settings模块,没有了最开始的那种心虚,还是觉得挺熟悉的。

就是代码量太多了,看着有点头大。

好吧。我们废话就介绍到此了,下面开始正文。本节主要介绍蓝牙—BluetoothAdapter的一些基本应用,一些简单的Android

API的使用。

一、 BluetoothAdapter类介绍

 

BluetoothAdapter类简单点来说就是代表了本设备(手机、电脑等)的蓝牙适配器对象,通过它我们可以蓝牙设备进行基本

开发了,主要有如下功能:

1、开关蓝牙设备

2、扫描蓝牙设备

3、设置/获取蓝牙状态信息,例如:蓝牙状态值、蓝牙Name、蓝牙Mac地址等;

由于网络上关于BluetoothAdapter的一些常用API函数都有了介绍,因此,我着重介绍一些BluetoothAdapter类疏忽的地方。

 1、BluetoothAdapter STATE 状态值 , 即开关状态


int STATE_OFF        蓝牙已经关闭

int STATE_ON        蓝牙已经打开

int STATE_TURNING_OFF      蓝牙处于关闭过程中 ,关闭ing

int STATE_TURNING_ON        蓝牙处于打开过程中 ,打开ing

上图中 , 红色线路图表示蓝牙由关闭状态 转向为打开状态的过程 ;

蓝色线路图表示蓝牙由打开状态 转向为关闭状态的过程

 2、BluetoothAdapter  SCAN_MOD状态值 ,即扫描状态

首先说明,可以扫描其他设备的,当然它同时能被其他蓝牙设备扫码。

int 
SCAN_MODE_CONNECTABLE         表明该蓝牙可以扫描其他蓝牙设备

int 
SCAN_MODE_CONNECTABLE_DISCOVERABLE

表 明该蓝牙设备同时可以扫码其他蓝牙设备,并且可以被其他蓝牙设备扫描到。

int 
SCAN_MODE_NONE : 该蓝牙不能扫描以及被扫描。

3、获得蓝牙适配器实例

public static synchronized BluetoothAdapter getDefaultAdapter ()

功能:获得本设备的蓝牙适配器实例。

返回值:如果设备具备蓝牙功能,返回BluetoothAdapter 实例;否则,返回null对象。

    4、打开/关闭蓝牙的两种方法:

 4.1、打开蓝牙:

①、直接调用函数enable()去打开蓝牙设备 ;

②、系统API去打开蓝牙设备,该方式会弹出一个对话框样式的Activity供用户选择是否打开蓝牙设备。

注意:如果蓝牙已经开启,不会弹出该Activity界面。

PS:在目前Android手机中,是不支持在飞行模式下开启蓝牙的。如果蓝牙已经开启,那么蓝牙的开关状态会随着飞行模式

的状态而发生改变。

代码示例分别如下:

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

      4.2、关闭蓝牙

直接调用API 函数即disable()即可。

public  boolean disable ()

功能:关闭蓝牙设备。

返回值:该函数会立即返回。

true    表示关闭操作成功

false   表示蓝牙操作失败 , ①、当前蓝牙已经关闭 ;  ②、其他一些异常情况

 5、扫描蓝牙设备


public boolean startDiscovery ()

功能: 扫描蓝牙设备

注意: 如果蓝牙没有开启,该方法会返回false ,即不会开始扫描过程。

public  boolean cancelDiscovery ()

功能: 取消扫描过程。

注意: 如果蓝牙没有开启,该方法会返回false。

public boolean isDiscovering ()

功能: 是否正在处于扫描过程中。

注意: 如果蓝牙没有开启,该方法会返回false。

   6、 获取蓝牙相关信息

public String getName ()

功能:获取蓝牙设备Name

public String getAddress ()

功能:获取蓝牙设备的硬件地址(MAC地址),例如:00:11:22:AA:BB:CC

public boolean setName (String name)

功能:设置蓝牙设备的Name,

public Set<BluetoothDevice> getBondedDevices ()

功能:获取与本机蓝牙所有绑定的远程蓝牙信息,以BluetoothDevice类实例(稍后讲到)返回。

注意:如果蓝牙为开启,该函数会返回一个空集合 。

public static boolean checkBluetoothAddress (String address)

功能: 验证蓝牙设备MAC地址是否有效。所有设备地址的英文字母必须大写,48位,形如:00:43:A8:23:10:F1 。

返回值: true 设备地址有效

false 设备地址无效

public BluetoothDevice getRemoteDevice (String address)

功能:以给定的MAC地址去创建一个 BluetoothDevice 类实例(代表远程蓝牙实例)。即使该蓝牙地址不可见,也会产生

一个BluetoothDevice 类实例。

返回:BluetoothDevice 类实例 。注意,如果该蓝牙设备MAC地址不能被识别,其蓝牙Name为null。

异常:如果MAC  address无效,抛出IllegalArgumentException。

 7、蓝牙相关广播


             Action值                                                说明


ACTION_STATE_CHANGED                    蓝牙状态值发生改变

ACTION_SCAN_MODE_CHANGED         蓝牙扫描状态(SCAN_MODE)发生改变

ACTION_DISCOVERY_STARTED             蓝牙扫描过程开始

ACTION_DISCOVERY_FINISHED             蓝牙扫描过程结束

ACTION_LOCAL_NAME_CHANGED        蓝牙设备Name发生改变

ACTION_REQUEST_DISCOVERABLE       请求用户选择是否使该蓝牙能被扫描

PS:如果蓝牙没有开启,用户点击确定后,会首先开启蓝牙,继而设置蓝牙能被扫描。

ACTION_REQUEST_ENABLE                  请求用户选择是否打开蓝牙

ACTION_FOUND  (该常量字段位于BluetoothDevice类中,稍后讲到)

说明:蓝牙扫描时,扫描到任一远程蓝牙设备时,会发送此广播。

通过注册这个广播,我们可以获取扫描到的蓝牙信息。方法如下:

  1. //扫描到了任一蓝牙设备
  2. if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction()))
  3. {
  4. Log.v(TAG, "### BT BluetoothDevice.ACTION_FOUND ##");
  5. BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  6. if(btDevice != null){
  7. Log.v(TAG , "Name : " + btDevice.getName() + " Address: " + btDevice.getAddress());
  8. }
  9. else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction()))
  10. {
  11. Log.v(TAG, "### BT ACTION_BOND_STATE_CHANGED ##");
  12. int cur_bond_state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);
  13. int previous_bond_state = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.BOND_NONE);
  14. Log.v(TAG, "### cur_bond_state ##" + cur_bond_state + " ~~ previous_bond_state" + previous_bond_state);
  15. }
  16. }

最后,关于这些广播的Intent信息,还有很多附加值,大家可以去看看Android SDK。

更多关于BluetoothAdapter类的API介绍,请参考农民伯伯的博客:

Android
中文API (69) —— BluetoothAdapter[蓝牙]

最后,在使用这两个类时,需要以下两个权限:

BLUETOOTH                    值为  "android.permission.BLUETOOTH"

BLUETOOTH_ADMIN      值为 "android.permission.BLUETOOTH_ADMIN"

二、 BluetoothDevice类介绍

该类就是关于远程蓝牙设备的一个描述。通过它可以和本地蓝牙设备---BluetoothAdapter连接通信。

1、 蓝牙绑定(Bound)状态 , 即蓝牙设备是否与其他蓝牙绑定

int  
BOND_BONDED       表明蓝牙已经绑定

int  
BOND_BONDING     表明蓝牙正在绑定过程中 , bounding

int  
BOND_NONE           表明没有绑定

更多关于BluetoothDevice类的更多介绍,请参考该农民伯伯的该篇博客:

Android
中文API (70) —— BluetoothDevice[蓝牙]

我也不再啰嗦了。

下面贴出一个小Demo吧,挺简单的,也就是关蓝牙API的基本操作和蓝牙相关广播的监听,处于显示目的方便性,本文对

蓝牙相关信息的获取,都通过Log输出。请大家注意。 截图如下:

代码什么的就不在张贴了,只是帮助大家学习过程中减少工作量而已,别无其他。

示例代码下载地址为:

  http://download.csdn.net/detail/qinjuning/4417003

最后关于如果连接某个蓝牙设备,就需要利用蓝牙部分的隐藏API了,关于这方面,大家可以看看hellogv的博客:

《Android提高第十三篇之探秘蓝牙隐藏API》

目前还没有机会研究这方面知识,以后会尝试的。 Good luck for U !

Android中蓝牙的基本使用----BluetoothAdapter类简介的更多相关文章

  1. Android中内容观察者的使用---- ContentObserver类详解 (转)

    前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...

  2. android中与SQLite数据库相关的类

    为什么要在应用程序中使用数据库?数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆 ...

  3. Android中方便好用的倒计时类

       一.使用api提供的类进行操作 Android提供了CountDownTimer来让我们进行倒计时,可以让我们很方便的进行倒计时的操作.使用方式也很简单,下面直接贴代码就好了: package ...

  4. Android中内容观察者的使用---- ContentObserver类详解

    详解:http://blog.csdn.net/qinjuning/article/details/7047607

  5. Android学习笔记(三)Application类简介

    每次运行APP时,Application类都保持实例化状态.与Activity不同,配置改变不会导致应用程序重启.通过继承Application类,可以完成一下3项工作: · 对Android运行时广 ...

  6. [转]Android中Application类的用法

    原文链接:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html Application类 Application ...

  7. 【转】Android中Application类用法

    转自:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html Application类 Application和A ...

  8. Android(java)学习笔记120:Android中的Application类用法

    1.简介 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就是 ...

  9. Android中Application类用法

    Application类 Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系 ...

随机推荐

  1. MySQLSocketPHPvimApache

    原文:http://www.blogjava.net/asenyifei/articles/82575.html 自己装了一个MYSQL客户端,但却发现出现这样的错误: Can't connect t ...

  2. android:一个Open键引发的问题!!

    1.问题简单介绍 首先描写叙述一下问题.当我们安装完APP的时候,界面会显示两个button,一个完毕键,一个Open键,点击Open键之后.进入应用.此时.我们点击HOME键.程序将会后台.然后再点 ...

  3. 妙味css3课程---1-1、css中自定义属性可以用属性选择器么

    妙味css3课程---1-1.css中自定义属性可以用属性选择器么 一.总结 一句话总结:可以的. 1.如何实现用属性选择器实现a标签根据href里面含有的字段选择背景图片? p a[href*=te ...

  4. win7桌面有个无法删除的IE图标

    平台:win7 症状:安装软件时没仔细看,结果装上了一大堆,挨个卸载后桌面残留了一个IE无法删除.在该图标上点右键只有“打开”“属性”“创建快捷方式”三个选项,主页默认为www.2345.com. 解 ...

  5. 洛谷 P1808 单词分类_NOI导刊2011提高(01)

    P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当 ...

  6. 1.4 Python基础知识 - 代码书写格式及条件判断"if ... else ..."

    一.代码的书写规则 在所有的开发语言中,代码之间都是有关联的关系,有的是包含关系,有的是上下级关系,有的是代表语句的结束.在python中也是有相应的规则的: 1.在没有上下级关系的代码中,代码要顶行 ...

  7. Redo 非current损坏

    Redo log 文件损坏或丢失,在启动数据库时在alert日志中会有如下错误: ORA-00313: open failed for members of log group 1 of thread ...

  8. (转)Oracle EXP-00091解决方法

    转自:http://blog.csdn.net/dracotianlong/article/details/8270136 EXP-: 正在导出有问题的统计信息. . . 正在导出表 WF_GENER ...

  9. Loadrunner--web_find和web_reg_find的用法和区别

    一.web_find()函数 该函数的作用是“在页面中查找相应的内容”,常用参数及含义如下: web_find("web_find", //定义该查找函数的名称 "Rig ...

  10. C语言深度剖析-----C语言中的字符串

    S1字符数组 S2字符串,存在于栈空间 S3最常规的写字符串的方法,malloc是堆空间,存在于只读存储区,我们不能够改变指向S3的数据 S4堆空间  S4 字符串的长度 判断字符串长度,assert ...