首先是此部分涉及到的类

  • BluetoothAdapter 蓝牙适配器,即该类里面包含了蓝牙使用中常用到的一些API。
  • BroadcastReceiver 广播接收者,不难猜测,蓝牙设备开启或者关闭、搜索到周边设备就要来通知应用,那么Android系统就会以广播的方式来通知。
  • BluetoothDevice 蓝牙设备,即一个相当于蓝牙设备的类,实现了Parcelable接口,用于Android的IPC通信机制。里面实在广播时发送的蓝牙的相关信息:蓝牙名称,地址,类型和uuid等。

蓝牙设备开启

public void enableBlueTooth() throws Exception {this.BTadapter = BluetoothAdapter.getDefaultAdapter();if (BTadapter == null) {throw new Exception("设备上没有发现有蓝牙设备");}if (!BTadapter.isEnabled()) {BTadapter.enable();}}

BTadapter就是BluetoothAdapter的对象,如果获取到的蓝牙适配器对象时null,就说明该设备不支持蓝牙,然后判断蓝牙是否开启,BTadapter .isEnabled()如果没有开启就返回false,BTadapter.enable()用于开启蓝牙设备。

蓝牙设备搜索

@Overridepublic void searchBlueTooth(Context context,SearchBlueToothListener mSearchListener) throws Exception {// TODO Auto-generated method stubLog.i("info", "准备开始搜索了");this.mSearchListener = mSearchListener;enableBlueTooth();if (BTadapter.isDiscovering()) {BTadapter.cancelDiscovery();}BTadapter.startDiscovery();IntentFilter iFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);context.registerReceiver(mSearchReceiver, iFilter);// 创建一个查找蓝牙设备的广播意图iFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);// 注册一个广播接收者,开启查找蓝牙设备意图后将结果以广播的形式返回context.registerReceiver(mSearchReceiver, iFilter);// 创建一个结束查找蓝牙设备结束的广播意图iFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);context.registerReceiver(mSearchReceiver, iFilter);}

首先,开启蓝牙设备,然后判断蓝牙设备是否正在搜索,如果正在搜索,就取消搜索,再开启重新搜索。
其次,蓝牙搜索会有开始搜索、搜索到设备、结束搜索三个阶段:
Android系统分别都会在这三个阶段给应用发送广播,应用注册相应的广播接收者,我这里注册了开启、发现、结束三个广播接收意向;在广播接收者中进行操作,而操作每一次使用大多不相同,所以我定义了一个接口,用户实现这个接口然后做自己的响应。

SearchBlueToothListener 接口:
public interface SearchBlueToothListener {public void startSearch();public void whileSearch(BluetoothDevice device);public void finishSearch(Map<String, List<BlueTooth>> blueToothMap);
}

而BlueTooth类知识自己定义的蓝牙类,用于存储蓝牙信息

public class BlueTooth {private String name;private String address;private int type;private ParcelUuid[] uuid;}

在广播接收者当中

private List<BlueTooth> connectedBlueTooths;
private List<BlueTooth> newBlueTooths;private BroadcastReceiver mSearchReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context arg0, Intent arg1) {// TODO Auto-generated method stubString action = arg1.getAction();switch (action) {case BluetoothAdapter.ACTION_DISCOVERY_STARTED:connectedBlueTooths.clear();newBlueTooths.clear();mSearchListener.startSearch();break;case BluetoothDevice.ACTION_FOUND:BluetoothDevice device = arg1.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);BlueTooth blueTooth = new BlueTooth();blueTooth.setName(device.getName());blueTooth.setAddress(device.getAddress());blueTooth.setType(device.getType());blueTooth.setUuid(device.getUuids());short rssi = arg1.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);Log.i("info", "蓝牙信号强度     " + rssi);if (device.getBondState() == BluetoothDevice.BOND_BONDED) {for (BlueTooth blueToothPul : connectedBlueTooths) {if (blueToothPul.getAddress().equals(blueTooth.getAddress()))return;}connectedBlueTooths.add(blueTooth);} else {for (BlueTooth blueToothPul : newBlueTooths) {if (blueToothPul.getAddress().equals(blueTooth.getAddress())) {return;}}newBlueTooths.add(blueTooth);}mSearchListener.whileSearch(device);break;case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:Map<String, List<BlueTooth>> blueToothMap = new HashMap<String, List<BlueTooth>>();// if (connectedBlueTooths != null// && connectedBlueTooths.size() > 0)blueToothMap.put(CONNECTED_BLUETOOTHS, connectedBlueTooths);// else// blueToothMap.put(CONNECTED_BLUETOOTHS, null);// if (newBlueTooths != null && newBlueTooths.size() > 0)blueToothMap.put(NEW_BLUETOOTHS, newBlueTooths);// else// blueToothMap.put(NEW_BLUETOOTHS, null);mSearchListener.finishSearch(blueToothMap);break;}}};

周边的蓝牙设备一般会有两种,一种是未配对的、还有就是已配对的,Android系统中以BondState绑定状态,来辨别蓝牙是否已经配对,所以我这里创建两个集合:connectedBlueTooths、newBlueTooths来保存搜索的蓝牙设备。

首先在接收到开始搜索广播的时候

    connectedBlueTooths.clear();newBlueTooths.clear();mSearchListener.startSearch();

将集合进行清零,避免在第二次搜索的时候加入了相同的两个设备。然后调用mSearchListener.startSearch();通知用户开始搜索了,用户所处相关的相应,比如告诉试用者开始搜索、正在搜索。

在接受到found广播的时候:

BluetoothDevice device = arg1.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);BlueTooth blueTooth = new BlueTooth();blueTooth.setName(device.getName());blueTooth.setAddress(device.getAddress());blueTooth.setType(device.getType());blueTooth.setUuid(device.getUuids());short rssi = arg1.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);

BlueToothDevice实现了Parcelable接口,用于Android的IPC通信机制,也就可以用于在intent中传输数据,当蓝牙设备发现周边一个蓝牙设备时就会发送来一个found的广播intent,并将蓝牙的相关信息以BlueToothDevice对象的形式发送过来,在intennt中获得该对象,就可以获得该蓝牙设备的相关信息了,然后我将它的信息保存到自己的BlueTooth类的对象中。并且,最后也多余的获得了一下蓝牙的信号强度。当然如果没有发现新设备就不会发送found广播了。

        if (device.getBondState() == BluetoothDevice.BOND_BONDED) {for (BlueTooth blueToothPul : connectedBlueTooths) {if (blueToothPul.getAddress().equals(blueTooth.getAddress()))return;}connectedBlueTooths.add(blueTooth);} else {for (BlueTooth blueToothPul : newBlueTooths) {if (blueToothPul.getAddress().equals(blueTooth.getAddress())) {return;}}newBlueTooths.add(blueTooth);}mSearchListener.whileSearch(device);

这里依据该蓝牙设备的BondState来判断该蓝牙设备是否已经配对过,再通过遍历相应的集合来判断该设备是否已经找到过并添加到集合中过,避免重复添加,然后将该蓝牙设备信息添加到相应的集合当中。最后再通知用户找到一个蓝牙设备,并直接将广播发送来的蓝牙设备BlueToothDevice发给用户,做出相关相应。

最后接收到搜索结束广播

Map<String, List<BlueTooth>> blueToothMap = new HashMap<String, List<BlueTooth>>();// if (connectedBlueTooths != null// && connectedBlueTooths.size() > 0)blueToothMap.put(CONNECTED_BLUETOOTHS, connectedBlueTooths);// else// blueToothMap.put(CONNECTED_BLUETOOTHS, null);// if (newBlueTooths != null && newBlueTooths.size() > 0)blueToothMap.put(NEW_BLUETOOTHS, newBlueTooths);// else// blueToothMap.put(NEW_BLUETOOTHS, null);mSearchListener.finishSearch(blueToothMap);

这里通过一个Map的方式保存两种蓝牙设备的集合key值分别为:

    public final static String CONNECTED_BLUETOOTHS = "connectedBlueTooths";public final static String NEW_BLUETOOTHS = "newBlueTooths";

然后将map传递给用户,用户通过map提取相应的数据,就能知道附近的未配对和已经配的蓝牙设备有哪些了。

至此结束第一篇获取周边的蓝牙设备

下面贴出整合蓝牙操作的Java源代码:
码云链接:https://gitee.com/D_inasour/codes/8c5yt4nd2xb9uzml10h7e16
csdn资源链接:http://download.csdn.net/download/d_inosaur/9946750

欢迎入门学习交流,系统收费0.1,勿在意:

Android开发蓝牙篇之蓝牙设备开启、搜索周边蓝牙设备相关推荐

  1. Android开发——蓝牙通信实现

    Android开发--蓝牙通信实现 项目需求 项目主要代码及功能实现 AndroidManifest.xml res/values/string.xml activity_main.xml ChatS ...

  2. Bluetooth模块用于管理蓝牙设备,搜索附近蓝牙设备、实现简单数据传输

    Bluetooth模块用于管理蓝牙设备,搜索附近蓝牙设备.实现简单数据传输等. 支持搜索发现所有蓝牙设备,但仅支持低功耗蓝牙ble传输协议,不支持蓝牙设备的配对连接传输大量数据. 如果要连接非ble蓝 ...

  3. android开发蓝牙是否可见开关_如何从后台开启android蓝牙的可见性以及始终保持可见性...

    最近工作中遇到一个特殊的需求,要求代码能够从后台开机android手机蓝牙的可见性.而framework提供了一种打开可见性的操作,就是通过向用户弹出一个提示框,来询问是否允许开启可见性.而且限制了最 ...

  4. Android开发笔记(一百六十二)蓝牙设备的连接与配对

    蓝牙是一种短距离无线通信技术,它由爱立信公司于1994年创制,原本想替代连接电信设备的数据线,但是后来发现它也能用于移动设备之间的数据传输,所以蓝牙技术在手机上获得了长足发展. 因为手机内部的通讯芯片 ...

  5. Android开发--蓝牙操作

    首先,由于模拟器上没有蓝牙装置,所以我们需要一个含有蓝牙装置的Android系统 其次,要操作设备上的蓝牙装置,需要在AndroidManifest中声明两个权限: <uses-permissi ...

  6. android开发蓝牙传输图片,如何发送/接收文本和图片通过蓝牙android到另一个android手机...

    我假设你已经在开发Android的蓝牙应用的经验. Android蓝牙API不直接支持OBEX,意味着我无法将任何文件直接推送到任何设备. Android蓝牙API提供诸如发现,连接和使用流的数据传输 ...

  7. android开发蓝牙是否可见开关_android开发之蓝牙初步 扫描已配对蓝牙、更改蓝牙可见性、搜索外部蓝牙设备 | 学步园...

    这两天我学习了android蓝牙的一些简单操作,今天和大家分享一下. 一,获得BluetoothAdapter对象 BluetoothAdapter adapter = BluetoothAdapte ...

  8. Android开发蓝牙与ble设备的通讯

    一.写在前面的话 一直想写一篇关于蓝牙与ble设备通讯的博客,但是一直也不知道从何下手,可能是之前思路不清晰吧,也就一直拖拖拖,拖到现在.最近又做到关于ble设备的项目了,在此总结一下吧.(如有不到位 ...

  9. android 开发蓝牙电子秤,GitHub - xiangbohua/scales-bridge: scales-bridge 电子称 蓝牙电子秤 连接库...

    蓝牙电子称连接库 -- ####功能 封装电子秤连接业务 支持连接使用蓝牙串口.USB串口的电子秤 通过添加协议即可支持不同的电子秤 类型说明 WeightDataProtocol封装协议,此协议对字 ...

  10. android没有蓝牙设备,【Android】没有触发LeScanCallback导致无法搜索到蓝牙设备

    在Android6.0以上,部分机型需要开启定位权限,部分机型需要同时开启GPS.所以使用蓝牙之前,需要动态申请定位权限,或者直接将targetSdkVersion设置为23以下. 需要在Androi ...

最新文章

  1. Windows命令远程执行工具Winexe
  2. ORA-01034: ORACLE not available ORA-27101
  3. md5sum算法 —— linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序
  4. Android 极光推送设置别名
  5. std::set作为一个有序集合
  6. 精通Android自定义View(十三)事件分发简述
  7. php中文件上传$_FILES 的错误代码
  8. MySQL笔试题附加自己写的答案
  9. xci转nsp工具_再谈xci、nsz、nsp
  10. html怎么设置用户登录界面设计,html怎么做用户登录界面设计步骤,登录界面设计这样做?...
  11. autorunner测试java_AutoRunner自动化测试工具
  12. unity 无法打包
  13. bzoj 3640 JC的小苹果
  14. vue中a的href写法
  15. 【数据压缩-实验5】JPEG原理分析及JPEG解码器的调试
  16. Form(窗体)的FormBorderStyle属性的不同效果
  17. 多可文档管理系统,我的文档是什么?
  18. Mybatis测试运行异常之Type interface com.testmybatis.dao.bill.BillMapper is not known to the MapperRegistry.
  19. Nginx 菜鸟教程从初学到应用
  20. python莫比乌斯_用python绘出一个莫比乌斯环

热门文章

  1. iMazing中IPA文件的介绍与管理
  2. Android开发笔记(一百八十六)管理SQLite的利器——应用检查器App Inspection
  3. 热身赛-巴西5-1坦桑尼亚 卡卡传射罗比两破门
  4. MySQL数据库餐厅点菜系统_餐馆点餐管理系统-数据库课程设计-MySQL
  5. Elasticsearch Nested 选型,先看这一篇!
  6. vue3中tsx的基本语法使用
  7. no-sql数据库之redis
  8. 什么高大填空四个字动人_什么发亮填空四字词语
  9. dat image 微信_微信电脑微信image文件夹下的dat文件怎么打开?
  10. 计算机应用程序是啥意思,为什么某些Mac应用程序需要“使用辅助功能控制此计算机?...