我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android蓝牙开发

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android蓝牙开发

题引:

最近项目上涉及与硬件相关的功能,需要通过蓝牙进行消息收发。项目已完成,这里做下记录。

通信步骤:

初始化BluetoothAdapter.getDefaultAdapter()获取BluetoothAdapter对象
2.判断蓝牙是否开启bluetoothAdapter.isEnabled()
3.未开启,进行开启操作bluetoothAdapter.enable();有返回值,为true证明开启成功
4.注册蓝牙开关广播 BluetoothAdapter.ACTION_STATE_CHANGED  监听开关等状态
5.搜索蓝牙设备 bluetoothAdapter.startDiscovery();
6.点击对配,需要判断是是否有过配对,有则连接;无则配对
7.依据广播状态改变文字描述BluetoothDevice.ACTION_BOND_STATE_CHANGED
8.配对成功,自动连接需要开子线程device.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(device, 1);
9.监听连接广播,成功开启子线程接收数据,失败点击重连 
10.开启子线程发送消息

1.开启或关闭蓝牙

1通过BluetoothAdapter.getDefaultAdapter();拿到蓝牙适配器,其中isEnabled()可直接返回当前蓝牙状态。

     public boolean getBluetoothSwitchState() {        if (bluetoothAdapter != null) {            return bluetoothAdapter.isEnabled();        }        return false;    }

2返回为false时,蓝牙处于关闭状态。通过bluetoothAdapter.enable();方法打开蓝牙,同样,bluetoothAdapter.disable();方法可关闭蓝牙。这两个方法均有返回值,可通过返回值判断是否开启成功!

        public boolean startBlueTooth() {        if (bluetoothAdapter == null) {            return false;        }        return bluetoothAdapter.enable();    }        public void closeBlueToothDevice() {        if (bluetoothAdapter == null) {            return;        }        bluetoothAdapter.disable();    }

3 注意:用户可将程序挂起,从设置页或下拉状态栏进行打开关闭蓝牙。如蓝牙关闭,此时APP需要通过广播进行监听,关闭则提示用户打开蓝牙,或退出程序。我讲所需要的广播先都提前写出!

receiver = new BluetoothReceiver();IntentFilter filter = new IntentFilter();filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); //监听蓝牙关闭和打开状态filter.addAction(BluetoothDevice.ACTION_FOUND); //搜索发现设备filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); //搜索完毕filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); //配对状态filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);//蓝牙连接成功filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); //蓝牙连接失败context.registerReceiver(receiver, filter);

 2. 设备搜索

1 蓝牙开启后,自动进行设备搜索

public void searchBluetooth() {  if (bluetoothAdapter == null) {     return;  }  bluetoothAdapter.startDiscovery();}

2广播监听搜索到的设备,进行列表展示(单个设备引入第二个重要类BluetoothDevice)

注意:搜索到设备可能存在空值,或重复搜索。需要自己在adpter或list中筛选。

3蓝牙搜索会后自动停止,对应停止广播BluetoothAdapter.ACTION_DISCOVERY_FINISHED:可在停止后进行配对,若没有扫描到对应设备则再次进行重新搜索

3.蓝牙配对

1蓝牙连接分配对与连接两个过程,如果未配对,则必须先进行配对,如果之前配对成功,并且没有取消配对,可直接进行连接;有三个参数,可判断对应设备与当前设备之间的关联

2 假设之前配对成功,该设备device.getBondState()为BOND_BONDED,以此来判断是否配对 

public boolean isPaired(BluetoothDevice device) {  if (device.getBondState() == BluetoothDevice.BOND_BONDED) {      return true;   }   return false;}

3.1配过对直接连接,当前写未配对情况。配对代码:

public void pairBluetoothDevice(BluetoothDevice device) {  try {    Method method = BluetoothDevice.class.getMethod("createBond");    method.invoke(device);  } catch (Exception e) {            LogUtils.error("pairBluetoothDeviceException : {}", e.getMessage());  }}

3.2 既然可以配对,当前可取消配对,将取消配对代码也给出:需要先判断下,之前是否配对成功,条件同3.2;

     public void canlePairBluetoothDevice(BluetoothDevice device) {        try {            Method method = BluetoothDevice.class.getMethod("removeBond");            method.invoke(device);        } catch (Exception e) {            LogUtils.error("canlePairBluetoothDeviceException : {}", e.getMessage());        }    }

 3.4 配对状态通过广播监听,监听后,改变状态展示给用户

5 参照系统蓝牙配对成功后需要自己连接设备。失败则刷新adapter,更新至最新状态等待用户下一步操作。

4.蓝牙连接 

1蓝牙连接代码:(需要在子线程中操作)

     public void connBluetoothDevice(BluetoothDevice device) {        new Thread() {            @Override            public void run() {                super.run();                try {                    mBluetoothSocket = (BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(device, 1);                    if (mBluetoothSocket != null) {                        if (!mBluetoothSocket.isConnected()) {mBluetoothSocket.connect();                        }                    }                } catch (Exception e) {                    LogUtils.error("connectException:{}", e.getMessage());                    mBluetoothSocket = null;                }            }        }.start();    }

2连接成功或失败在广播中进行监听

3成功,需要开启子线程进行数据接收操作,失败,自行处理;

    public void reviceMsg(Consumer consumer) {        if (mBluetoothSocket == null) {            LogUtils.error("reviceMsg socket is null");            return;        }        new Thread() {            @Override            public void run() {                super.run();                while (true) {                    char [] buffer = new char[1024];                    try {                        InputStream is = mBluetoothSocket.getInputStream();                        InputStreamReader inputStreamReader = new InputStreamReader(is, "GBK");                        int read = inputStreamReader.read(buffer);                        String readStr = new String(buffer, 0, read);                        LogUtils.info("reviceMsg:Msg ={};",readStr);                        consumer.accept(readStr);//                        is.close();//                        bluetoothSocket.close();                    } catch (Exception e) {                        LogUtils.error("reviceMsgException: {}", e.getMessage());                    }                }            }        }.start();    }

 4.4 同理,连接成功也需要像对应设备发送消息,代码如下:

     public void sendMsg(int msg) {        if (mBluetoothSocket == null) {            LogUtils.error("sendMsg socket is null");            return;        }        new Thread() {            @Override            public void run() {                super.run();                try {                    byte[] buffer = Integer.toHexString(msg).getBytes();                    OutputStream outputStream = mBluetoothSocket.getOutputStream();                    outputStream.write(buffer);                    outputStream.flush();                    LogUtils.info("sendMsg msg = {}",Integer.toHexString(msg));                } catch (Exception e) {                    LogUtils.error("sendMsgException : {}", e.getMessage());                }            }        }.start();    }

5.后记

至此,蓝牙通信功能基本实现,其中需要在清单文件配置权限,在此给出;目前还不知道怎么网CSDN放自己的代码类,回头知道了进行补齐!

6.补充

上面蓝牙开启时会弹出一个询问是否想要开启蓝牙,如果选择拒接是没有回调的。处理不友好,查阅资料发现有个带回调的开启蓝牙方法贴出:

    public void startBlueToothCallBack(Activity activity){        if (bluetoothAdapter == null) {            return;        }        if (!bluetoothAdapter.isEnabled()) {            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);            activity.startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);        }    }

在onActivityResult中进行回调操作:

@Override    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == BluetoothUtils.getInstance().REQUEST_ENABLE_BT && resultCode == RESULT_OK) {            //蓝牙已开启            searchBluetooth();        } else {            finish();        }    }

来源地址:https://blog.csdn.net/a1436237789/article/details/129180813

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android蓝牙开发

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android BLE蓝牙开发流程

Android BLE蓝牙开发流程包括以下步骤:1. 检查设备是否支持BLE:使用`BluetoothAdapter`类的`getDefaultAdapter()`方法来获取`BluetoothAdapter`对象,然后使用`isMulti
2023-09-20

Android蓝牙开发深入解析

1. 使用蓝牙的响应权限 代码如下:2022-06-06

Android 蓝牙开发实例解析

在使用手机时,蓝牙通信给我们带来很多方便。那么在Android手机中怎样进行蓝牙开发呢?本文以实例的方式讲解Android蓝牙开发的知识。 1、使用蓝牙的响应权限 XML/HTML代码
2022-06-06

Android 蓝牙BLE开发完全指南

目录 介绍连接模式GATT协议使用过程扫描连接设备连接发现服务数据传输其他断开连接参考总结 介绍 1.BLE 是 Bluetooth Low Energy 的缩写,意思为低功耗蓝牙。由蓝牙技术联盟(Bluetooth SIG)设计的无线通讯
2022-06-07

iOS蓝牙开发 蓝牙连接和数据读写

在做蓝牙开发之前,最好先了解一些概念: 服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口; 特征(characteristic):存在于服务下面的,一个服务下面
2022-05-26

Android蓝牙开发系列文章-玩转BLE开发(一)

我们在《Android蓝牙开发系列文章-策划篇》中计划讲解一下蓝牙BLE,现在开始第一篇:Android蓝牙开发系列文章-玩转BLE开发(一)。计划要写的BLE文章至少分四篇,其他三篇分别讲解:BLE Server端编码(用手机模拟外围设备
2022-06-06

android蓝牙简单开发的方法是什么

本篇内容介绍了“android蓝牙简单开发的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概述前段时间学习了一些蓝牙开发的知识,记
2023-06-21

android蓝牙开发的基本流程是什么

Android蓝牙开发的基本流程如下:1. 检查设备是否支持蓝牙功能:使用BluetoothAdapter类的getDefaultAdapter()方法获取蓝牙适配器。如果返回null,则表示设备不支持蓝牙功能。2. 打开蓝牙:使用Blue
2023-09-25

【Android】蓝牙快速开发工具包-入门级

开头语 方便快速开发蓝牙,封装常用的操作。 需要以下三个权限: android.permission.BLUETOOTH android.permission.BLUETOOTH_ADMIN android.permission.ACCES
2022-06-06

分享Android 蓝牙4.0(ble)开发的解决方案

最近,随着智能穿戴式设备、智能医疗以及智能家居的普及,蓝牙开发在移动开中显得非常的重要。由于公司需要,研究了一下,蓝牙4.0在Android中的应用。 以下是我的一些总结。 1.先介绍一下关于蓝牙4.0中的一些名词吧: (1)、GATT(G
2022-06-06

Android蓝牙总结

因为之前有做与蓝牙有关的项目,所以这里写个博客总结一下。 附带了一个项目以供参考:https://github.com/979451341/BleStudy 一.蓝牙操作流程 1.获取蓝牙服务mBluetoothManager = (Blu
2022-06-06

Android 蓝牙广播

蓝牙广播 广播蓝牙状态变化(开关状态)广播蓝牙设备发现广播蓝牙配对(配对操作)广播ACL 连接状态变化广播蓝牙绑定状态变化(配对状态)广播蓝牙服务启动广播蓝牙服务停止广播蓝牙连接状态广播蓝牙扫描模式广播蓝牙音频状态广播蓝牙数据传输广
2023-08-17

Android蓝牙的开启和搜索设备功能开发实例

这篇文章主要介绍了Android蓝牙服务启动搜索流程,了解内部原理是为了帮助我们做扩展,同时也是验证了一个人的学习能力,如果你想让自己的职业道路更上一层楼,这些底层的东西你是必须要会的
2023-05-14

Android蓝牙开发系列文章-AudioTrack播放PCM音频

终于迎来了蓝牙a2dp的第二篇:利用AudioTrack播放PCM音频数据。如想查看更多内容,请点击《Android蓝牙开发系列文章-策划篇》。 先回顾一下上一篇文章《Android蓝牙开发系列文章-蓝牙音箱连接》讲到的蓝牙音箱的完成配对、
2022-06-06

Win8.1系统蓝牙怎么开? win8.1怎么打开蓝牙

今天有朋友问小编说不知道新装的Win8.1蓝牙怎么开,使用蓝牙的时候,就弹出这个窗口,但是蓝牙相关的服务已经开启。 以上是他的问题情况,小编编程初步分析是应该是蓝牙js设备被禁用的js关系,可以按下面的步骤尝试解决: 桌面上右键点击&ld
2023-06-02

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录