BluetoothAdapter
    
     代表了移动设备的本地的蓝牙适配器
    
    
     ,
    
    
     通过该蓝牙适配器可以对蓝牙进行基本操作
    
    
     ,
    
    
     例如
    
    
     :
    
    
     启动设备发现
    
    
     (startDiscovery),
    
    
     获取已配对设备
    
    
     (getBoundedDevices),
    
    
     通过
    
    
     mac
    
    
     蓝牙地址获取蓝牙设备
    
    
     (getRemoteDevice),
    
    
     从其它设备创建一个监听连接
    
    
     (listenUsingRfcommWithServiceRecord);BluetoothAdapter.getDefaultAdapter()
    
    
     该静态方法可以获取该适配器对象
    
    
     .
    
   
    
     
      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”,
    
   
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;
    
   
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)
    
     获取蓝牙适配器
    
   
public static sychronized BluetoothAdapter getDefaultAdapter();
    
     返回值
    
    :
    
     本地蓝牙适配器
    
    
     BluetoothAdapter
    
    
     对象
    
    
     ;
    
   
    (2)
    
     获取
    
    
     state
    
    
     状态方法
    
   
public int getState();
    
     作用
    
    :
    
     获取是否可用
    
   
    
     返回值
    
    :
    
     返回当前的
    
    
     State
    
    
     状态值
    
    
     , STATE_ON, STATE_OFF, STATE_TURNING_ON, STATE_TURNING_OFF;
    
   
    
     权限
    
    : BLUETOOTH;
   
    (3)
    
     蓝牙是否可用
    
   
public boolean isEnable();
    
     作用
    
    :
    
     获取当前设备蓝牙模块是否可用
    
    
     ;
    
   
    
     返回值
    
    :
    
     返回当前蓝牙模块是否可用
    
    
     , true
    
    
     可用
    
    
     , false
    
    
     不可用
    
    
     ;
    
   
    
     权限
    
    : BLUETOOTH
    
     权限
    
    
     ;
    
   
    (4)
    
     打开蓝牙
    
   
public boolean enable();
    
     作用
    
    :
    
     打开本地蓝牙适配器
    
    
     ;
    
   
    
     返回值
    
    :
    
     如果打开成功则返回
    
    
     true,
    
    
     如果打开失败返回
    
    
     false;
    
   
    
     权限
    
    :
    
     BLUETOOTH_ADMIN
    
    
     权限
    
    
     ;
    
   
    (5)
    
     关闭蓝牙
    
   
public boolean disable();
    
     作用
    
    :
    
     关闭本地设备蓝牙
    
    
     ;
    
   
    
     返回值
    
    :
    
     如果关闭蓝牙成功
    
    
     ,
    
    
     返回
    
    
     true;
    
    
     如果关闭蓝牙失败
    
    
     ,
    
    
     返回
    
    
     false;
    
   
    
     权限
    
    : BLUETOOTH_ADMIN
    
     权限
    
    
     ;
    
   
    
     3.
     
      扫描相关方法
     
    
   
    (1)
    
     开始扫描
    
   
public boolean startDiscovery();
    
     作用
    
    :
    
     开始查找远程蓝牙设备
    
    
     ,
    
    
     先进行
    
    
     12
    
    
     秒的查询扫描
    
    
     (
    
    
     被动可见
    
    
     ),
    
    
     之后进行页面扫描
    
    
     (
    
    
     主动搜索
    
    
     );
    
    
     搜索过成功不能尝试对远程设备的连接
    
    
     ,
    
    
     同时已连接的设备的带宽也会被压缩
    
    
     ,
    
    
     等待时间变长
    
    
     ;
    
    
     使用
    
    
     cancelDiscovery()
    
    
     可以终止搜索
    
    
     ;
    
   
    
     返回值
    
    :
    
     如果成功则返回
    
    
     true,
    
    
     失败返回
    
    
     false;
    
   
    
     权限
    
    :
   
    BLUETOOTH_ADMIN
    
     权限
    
    
     ;
    
   
    (2)
    
     是否在扫描中
    
   
public boolean isDiscovering();
    
     作用
    
    :
    
     是否正在搜索
    
    
     ;
    
   
    
     返回值
    
    :
    
     如果设备正在搜索
    
    
     ,
    
    
     返回
    
    
     true;
    
    
     如果设备没有进行蓝牙搜索
    
    
     ,
    
    
     返回
    
    
     false;
    
   
    
     权限
    
    : BLUETOOTH
    
     权限
    
    
     ;
    
   
    (3)
    
     取消查找
    
   
public boolean cancelDiscovery();
    
     作用
    
    :
    
     取消蓝牙搜索
    
    
     ;
    
    
     在进行
    
    
     connect()
    
    
     方法的时候
    
    
     ,
    
    
     必须调用这个方法
    
    
     ,
    
    
     蓝牙搜索是一个服务进行
    
    
     ,
    
    
     在搜索中的时候
    
    
     ,
    
    
     不能进行连接
    
    
     ;
    
   
    
     返回值
    
    :
    
     如果取消成功
    
    
     ,
    
    
     则返回
    
    
     true;
    
    
     如果取消失败
    
    
     ,
    
    
     返回
    
    
     false;
    
   
    (4)
    
     获取扫描模式
    
   
public int getScanMode();
    
     作用
    
    :
    
     获取当前蓝牙的扫描模式
    
    
     ;
    
   
    
     返回值
    
    : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;
   
    
     4.
     
      与蓝牙设备相关的方法
     
    
   
    (1)
    
     检查蓝牙地址是否有效
    
   
public boolean checkBluetoothAddress(String address);
    
     作用
    
    :
    
     检查蓝牙地址是否合法
    
    
     ,
    
    
     蓝牙地址字母必须大写
    
    
     ,
    
    
     例如
    
    
     : “00:43:A8:23:10:F0”;
    
   
    
     参数
    
    : 17
    
     位的字符串
    
    
     ,
    
    
     例如
    
    
     : “00:43:A8:23:10:F0”;
    
   
    
     返回值
    
    :
    
     如果蓝牙地址合法返回
    
    
     true,
    
    
     反之返回
    
    
     false;
    
   
    (2)
    
     获取本地蓝牙地址
    
   
public String getAddress();
    
     作用
    
    :
    
     返回本地蓝牙的
    
    
     MAC
    
    
     地址
    
    
     ;
    
   
    
     返回值
    
    :
    
     本地的硬件地址
    
    
     ;
    
   
    (3)
    
     获取本地蓝牙名称
    
   
public String getName();
    
     返回值
    
    :
    
     本地蓝牙设备的名称
    
    
     ;
    
   
    (4)
    
     获取绑定的蓝牙集合
    
   
public Set<BluetoothDevice> getBoundedDevices();
    
     作用
    
    :
    
     获取已经配对的蓝牙设备的集合
    
    
     ,
    
    
     如果蓝牙未被打开
    
    
     ,
    
    
     则返回
    
    
     null;
    
   
    (5)
    
     获取远程蓝牙设备
    
   
public BluetoothDevice getRemoteDevice(String address);
    
     作用
    
    :
    
     根据蓝牙的物理地址获取远程的蓝牙设备
    
    
     ,
    
    
     如果地址不合法
    
    
     ,
    
    
     就会产生异常
    
    
     ;
    
   
    
     返回值
    
    :
    
     获取到的
    
    
     BluetoothDevice
    
    
     对象
    
    
     ;
    
   
    (6)
    
     创建监听
    
   
Public BluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);
    
     作用
    
    :
    
     创建一个监听
    
    
     Rfcommon
    
    
     端口的蓝牙监听
    
    
     ,
    
    
     使用
    
    
     accept()
    
    
     方法监听
    
    
     ,
    
    
     并获取
    
    
     BluetoothSocket
    
    
     对象
    
    
     ;
    
    
     该系统会根据一个服务名称
    
    
     (name)
    
    
     和唯一的识别码
    
    
     (uuid)
    
    
     来创建一个
    
    
     SDP
    
    
     服务
    
    
     ,
    
    
     远程蓝牙设备可以根据唯一的
    
    
     UUID
    
    
     来连接这个
    
    
     SDP
    
    
     服务器
    
    
     ;
    
   
    
     参数
    
    : name : SDP
    
     服务器名称
    
    
     , UUID, SDP
    
    
     记录下的
    
    
     UUID;
    
   
    
     返回值
    
    :
    
     正在监听蓝牙端口
    
    
     ;
    
   
    
     权限
    
    : BLUETOOTH;
   
(7)public Boolean setName(String name)
作用:设置蓝牙的名称。
    
     5.
     
      常用用法
     
    
   
    1.
    
     打开蓝牙
    
   
    
     第一种打开方法:调用
    
    
     enable
    
    
     即可
    
    
    
   
booleanresult = mBluetoothAdapter.enable();
    
     第二种打开方法
    
    
     ,调用系统
    
    API
    
     去打开蓝牙
    
    
    
   
    if(!mBluetoothAdapter.isEnabled()) //
    
     未打开蓝牙,才需要打开蓝牙
    
    
    
   
{
Intent intent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, REQUEST_OPEN_BT_CODE);
    
     会以
    
    Dialog
    
     样式显示一个
    
    
     Activity
    
    
     , 我们可以在
    
    
     onActivityResult()
    
    
     方法去处理返回值
    
    
    
   
}
    
     第一种方法打开蓝牙
    
    ,
    
     没有任何提示
    
    
     ,
    
    
     直接就打开了
    
    
     ;
    
   
    
     第二种方法发送广播
    
    ,
    
     会弹出一个对话框
    
    
     ,
    
    
     选择是否打开蓝牙
    
    
     ,
    
    
     选择是蓝牙才打开
    
    
     ;
    
   
    2.
    
     设置可见
    
   
    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
    
    
     秒
    
    
     ;
    
   
 
