前言

这两天在开发一个android版的手机蓝牙通信的的APP,对android的蓝牙机进行了一个简单的研究

android上的蓝牙分为两种经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)

因为我开发的是经典蓝牙开发的这里就简单讲下如何开发

开发前建议大家先去看下谷歌官方的蓝牙说明

https://developer.android.google.cn/guide/topics/connectivity/bluetooth

经典蓝牙

第一步 申请权限

<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <!-- 仅在支持BLE(即蓝牙4.0)的设备上运行 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 如果Android 6.0蓝牙搜索不到设备,需要补充下面两个权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" /> <!-- 网络权限 -->

大概要申请这么多权限

这里发起前要注意下,android 9以后,关键性权限需要用户第二次确认才能调用,所以这个发起搜索肯定是写在权限回调里面的

//申请用户权限
ActivityCompat.requestPermissions(MainActivity.this, mPermissionListnew, mOpenCode);

第二歩 发起搜索

获取当前蓝牙管理器

 mBluetooth = BluetoothAdapter.getDefaultAdapter();

判断当前蓝牙是否启动

  //蓝牙服务未启动if (!mBluetooth.isEnabled()) {boolean enable = mBluetooth.enable();if (!enable) {SystemExit(getString(R.string.initBluetooth));return;}}

下面是完整代码

// 权限回调
@Override
@SuppressLint("MissingPermission")
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);//判断权限是否同意 这里要注意下,每个安卓版本的权限是不一样的for (Integer permission : grantResults) {if (permission != 0) {SystemExit(getString(R.string.run));return;}}//从系统服务中获取蓝牙管理器//这里虽然写了很多,但是BluetoothAdapter.getDefaultAdapter() 这个就可以的if (mBluetooth == null) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//从系统服务中获取蓝牙管理器BluetoothManager bm = getSystemService(BluetoothManager.class);mBluetooth = bm.getAdapter();} else {//获取系统默认的蓝牙适配器mBluetooth = BluetoothAdapter.getDefaultAdapter();}if (mBluetooth == null) {SystemExit("没有蓝牙功能");return;}}//蓝牙服务未启动if (!mBluetooth.isEnabled()) {boolean enable = mBluetooth.enable();if (!enable) {SystemExit(getString(R.string.initBluetooth));return;}}if (requestCode == mOpenCode) {//初始化蓝牙initBluetooth();}
}

上面写了那么多其实本质上还是在申请权限那一批里面

下面开始进行蓝牙扫描

也就是上面initBluetooth()方法

开启蓝牙扫描

开启蓝牙扫很简单调用下startDiscovery()方法就行

@SuppressLint("MissingPermission")
private void beginDiscovery() {if (mBluetooth != null && !mBluetooth.isDiscovering()) {mBluetooth.startDiscovery();//开始扫描周围的蓝牙设备}
}

获取蓝牙扫描的返回数据

获取蓝牙扫描数据,就要先注册广播,通过广播回调进行获取数据

//需要过滤多个动作,则调用IntentFilter对象的addAction添加新动作
IntentFilter discoveryFilter = new IntentFilter();
//获取新的数据
discoveryFilter.addAction(BluetoothDevice.ACTION_FOUND);
//连接上了
discoveryFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
//状态改变
discoveryFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
//蓝牙连接状态更改
discoveryFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
//蓝牙即将断开
discoveryFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
//注册蓝牙设备搜索的广播接收器 discoveryReceiver()这个是回调函数
registerReceiver(discoveryReceiver, discoveryFilter);

回调方法

@SuppressLint("MissingPermission")public final BroadcastReceiver discoveryReceiver = new BroadcastReceiver() {@RequiresApi(api = Build.VERSION_CODES.R)@SuppressLint("NotifyDataSetChanged")@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);int bondState = device.getBondState();Fruit fruit = new Fruit();fruit.setAddress(device.getAddress());//发现新的蓝牙设备fruit.setName(device.getName());if (fruit.getName() == null || fruit.getName().length() == 0) {fruit.setName("N/A");}fruit.setState(bondState);fruit.setBluetoothType(device.getType());short rssi = intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);fruit.setRssi(rssi + "");fruit.setBluetoothDevice(device);onActivityDataChangedListener.addFruitData(fruit);switch (action) {case BluetoothDevice.ACTION_FOUND:break;//蓝牙状态修改//断开蓝牙连接case BluetoothDevice.ACTION_ACL_DISCONNECTED:case BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED:BluetoothServiceConnect remove = StaticObject.bluetoothSocketMap.remove(device.getAddress());if (remove != null) {ToastUtil.toastWord(MainActivity.this, MainActivity.this.getString(ConnectTheInterrupt));remove.close();Msg m = new Msg(device.getAddress());m.setStateType(1);try {StaticObject.mTaskQueue.put(m);} catch (InterruptedException e) {e.printStackTrace();}}//蓝牙状态修改case BluetoothDevice.ACTION_ACL_CONNECTED:case BluetoothDevice.ACTION_BOND_STATE_CHANGED:
/*                    fruit.setState(bondState);short rssi = intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);fruit.setRssi(rssi + "");onActivityDataChangedListener.addFruitData(fruit);*///adapter.notifyDataSetChanged();break;}}};

另外说下 通过**getBondedDevices()**这个方法可以获取已经配对了蓝牙信息

Set<BluetoothDevice> bondedDevices = mBluetooth.getBondedDevices();if (bondedDevices != null && bondedDevices.size() != 0) {for (BluetoothDevice device : bondedDevices) {Fruit fruit = new Fruit();fruit.setAddress(device.getAddress());fruit.setName(device.getName());fruit.setState(device.getBondState());fruit.setBluetoothType(device.getType());fruit.setBluetoothDevice(device);onActivityDataChangedListener.addFruitData(fruit);}
}

连接蓝牙

上面已经获取了蓝牙驱动,接下来就是连接蓝牙了,这一步比较简单

通过方法回调获取BluetoothDevice 对象,调用createInsecureRfcommSocketToServiceRecord()这个方法,传入uuid来获取socker连接

uuid说明https://note.youdao.com/s/QLLkD2ZA

    static final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";BluetoothSocket insecureRfcommSocketToServiceRecord= bluetoothDevice.createInsecureRfcommSocketToServiceRecord(UUID.fromString(SPP_UUID));
insecureRfcommSocketToServiceRecord.connect();
//然后这里就获取到输入流和输出流,接下来就可以进行交互了
insecureRfcommSocketToServiceRecord.getOutputStream()
insecureRfcommSocketToServiceRecord.getInputStream()

关于andrion(安卓) 蓝牙(经典蓝牙)客户端连接相关推荐

  1. 为新手准备的安卓连接经典蓝牙模块教程

    绪论: 本人业余爱好者一个,无android基础,在开发android蓝牙的时候遇到了很多问题,其中最难受的还是基础不够好而看不懂别人在写什么.所以针对新手,我想写一个新手也完完全全能看懂的教程(连a ...

  2. android pin码 经典蓝牙_Android蓝牙开发—经典蓝牙详细开发流程

    Android蓝牙开发-经典蓝牙详细开发流程 发布时间:2018-07-16 13:41, 浏览次数:637 , 标签: Android Android蓝牙开发前,首先要区分是经典蓝牙开发还是BLE( ...

  3. 基于经典蓝牙的安卓蓝牙APP开发(基于蓝牙2.0开发,例:HC-05)

    基于经典蓝牙的安卓蓝牙开发-串口 一.展现广播的三种方式 1.通知: 2.对话框: 3.消息提示框 2.在使用Android蓝牙适配器中的startDiscovery需要先打开定位服务 3.在连接蓝牙 ...

  4. 网络调试助手:安卓APP集成TCP、UDP、经典蓝牙、低功耗蓝牙的调试demo

    1.前言 我终于不需要调试一个硬件设备装一个APP了,在应用商店下载别人的网络调试助手,又有广告,还不如直接写一个比较完整的网络调试助手.目前支持的功能有tcp客户端和服务端,udp,低功耗蓝牙客户端 ...

  5. Java:PC端作为客户端连接蓝牙设备并接收蓝牙发送的数据

    感谢:(1)PC端蓝牙开发  https://www.cnblogs.com/zeussbook/p/12827479.html https://blog.csdn.net/svizzera/arti ...

  6. ESP32 (经典蓝牙 SPP)-蓝牙学习(9)

    提示:本博客作为学习笔记,有错误的地方希望指正   绪论:这里主要讲解一些关于ESP32的经典蓝牙,蓝牙是一个比较庞大的体系,需要又一些基础知识才可以更好的学习,这里有一些写的比较好的关于蓝牙的文章. ...

  7. Android经典蓝牙开发简介(Google官网译文)

    公司的项目最近需要用到蓝牙开发的相关内容,因此特地查阅了Google官方文档的内容并进行二次整理,希望能对需要学习该部分的朋友有所帮助. 原文地址:http://developer.android.c ...

  8. Android 蓝牙技术(一)- 经典蓝牙

    Android平台支持蓝牙设备通过蓝牙协议栈来实现无线通信.应用层提供了Bluetooth APIs来使用蓝牙功能, 这些API可以使应用可以无线连接其他蓝牙设备实现点对点及多点间通信. 使用Blue ...

  9. Android经典蓝牙开发全流程

    一.基本介绍   所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,最初是由爱立信公司公司发明的.技术始于爱立信公司 1994 方案,它是研究在移动电话和其他配件间进行低功耗.低成本无 ...

最新文章

  1. 如何使用FaunaDB + GraphQL
  2. GARFIELD@07-12-2005 DILBERT
  3. qemu模拟执行固件文件(解决 Invalid ELF image for this architecture 问题)
  4. linux 给用户tmp权限,linux用户以及权限
  5. 适合入门代码审计之熊海cms
  6. Nginx与Serssion一致性问题
  7. SU Demos-05Sorting Traces-03susorty
  8. 哈佛博士生经验分享:10种方法让你在读博阶段更加轻松愉快
  9. Linux中点号,星号,加号,问号实战
  10. ThinkPHP RBAC如何自动获取所有模块的函数
  11. C#笔记09 结构、枚举、异常、泛型、操作符重载、dll、垃圾回收与资源清理、XML注释
  12. c语言 搜索彩票期数,根据福利彩票的规则用c++编写一个买彩票开奖的程序,求程序代码,谢谢...
  13. JSP 九大内置对象及四个作用域详解
  14. 高等数学教材上册复习
  15. php 函数名,php里函数名或者方法名前加 符号表示的意思
  16. oracle web创建表空间,oracle 创造表空间常用
  17. 新款 Mac mini(2018) 性能及接口分析
  18. 三星ml1660拆机图解_三星s6拆机图解介绍
  19. 攻防世界 Web-mfw
  20. 习题 3.12 给出一个不多于5位的正整数,要求:1. 求出它是几位数;2. 分别打印出每一位数字;3. 按逆序打印出各位数字,例如原数位321,应输出123。

热门文章

  1. 卷积核权值初始化_CNN怎么自定义卷积核初始值?
  2. 调用Web Service实现天气预报
  3. 暑期实训21组第一周个人工作总结
  4. powerdesigner 使用excel 批量导入创建表
  5. Enzo CYTO-ID自噬检测试剂盒特点作用机制
  6. 数据恢复大师打折方法
  7. Tomcat 基于端口的虚拟主机配置
  8. 利用Google AIY Vision Kit 自制人类检测器(上)
  9. hisi3516dv300芯片基于hwmon驱动框架的温度获取驱动源码分析
  10. centos7搭建vs code的c/c++开发环境