zoukankan      html  css  js  c++  java
  • 详细解析BluetoothAdapter的详细api

    这篇文章将会详细解析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", 

    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;

    三 常用用法

    1.打开蓝牙

    //第一种打开方法: 调用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.设置可见

    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秒;

  • 相关阅读:
    【leetcode】1020. Partition Array Into Three Parts With Equal Sum
    【leetcode】572. Subtree of Another Tree
    【leetcode】123. Best Time to Buy and Sell Stock III
    【leetcode】309. Best Time to Buy and Sell Stock with Cooldown
    【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
    【leetcode】467. Unique Substrings in Wraparound String
    【leetcode】823. Binary Trees With Factors
    【leetcode】143. Reorder List
    【leetcode】1014. Capacity To Ship Packages Within D Days
    【leetcode】1013. Pairs of Songs With Total Durations Divisible by 60
  • 原文地址:https://www.cnblogs.com/netcorner/p/4760797.html
Copyright © 2011-2022 走看看