关于andrion(安卓) 蓝牙(经典蓝牙)客户端连接
前言
这两天在开发一个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(安卓) 蓝牙(经典蓝牙)客户端连接相关推荐
- 为新手准备的安卓连接经典蓝牙模块教程
绪论: 本人业余爱好者一个,无android基础,在开发android蓝牙的时候遇到了很多问题,其中最难受的还是基础不够好而看不懂别人在写什么.所以针对新手,我想写一个新手也完完全全能看懂的教程(连a ...
- android pin码 经典蓝牙_Android蓝牙开发—经典蓝牙详细开发流程
Android蓝牙开发-经典蓝牙详细开发流程 发布时间:2018-07-16 13:41, 浏览次数:637 , 标签: Android Android蓝牙开发前,首先要区分是经典蓝牙开发还是BLE( ...
- 基于经典蓝牙的安卓蓝牙APP开发(基于蓝牙2.0开发,例:HC-05)
基于经典蓝牙的安卓蓝牙开发-串口 一.展现广播的三种方式 1.通知: 2.对话框: 3.消息提示框 2.在使用Android蓝牙适配器中的startDiscovery需要先打开定位服务 3.在连接蓝牙 ...
- 网络调试助手:安卓APP集成TCP、UDP、经典蓝牙、低功耗蓝牙的调试demo
1.前言 我终于不需要调试一个硬件设备装一个APP了,在应用商店下载别人的网络调试助手,又有广告,还不如直接写一个比较完整的网络调试助手.目前支持的功能有tcp客户端和服务端,udp,低功耗蓝牙客户端 ...
- Java:PC端作为客户端连接蓝牙设备并接收蓝牙发送的数据
感谢:(1)PC端蓝牙开发 https://www.cnblogs.com/zeussbook/p/12827479.html https://blog.csdn.net/svizzera/arti ...
- ESP32 (经典蓝牙 SPP)-蓝牙学习(9)
提示:本博客作为学习笔记,有错误的地方希望指正 绪论:这里主要讲解一些关于ESP32的经典蓝牙,蓝牙是一个比较庞大的体系,需要又一些基础知识才可以更好的学习,这里有一些写的比较好的关于蓝牙的文章. ...
- Android经典蓝牙开发简介(Google官网译文)
公司的项目最近需要用到蓝牙开发的相关内容,因此特地查阅了Google官方文档的内容并进行二次整理,希望能对需要学习该部分的朋友有所帮助. 原文地址:http://developer.android.c ...
- Android 蓝牙技术(一)- 经典蓝牙
Android平台支持蓝牙设备通过蓝牙协议栈来实现无线通信.应用层提供了Bluetooth APIs来使用蓝牙功能, 这些API可以使应用可以无线连接其他蓝牙设备实现点对点及多点间通信. 使用Blue ...
- Android经典蓝牙开发全流程
一.基本介绍 所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,最初是由爱立信公司公司发明的.技术始于爱立信公司 1994 方案,它是研究在移动电话和其他配件间进行低功耗.低成本无 ...
最新文章
- 如何使用FaunaDB + GraphQL
- GARFIELD@07-12-2005 DILBERT
- qemu模拟执行固件文件(解决 Invalid ELF image for this architecture 问题)
- linux 给用户tmp权限,linux用户以及权限
- 适合入门代码审计之熊海cms
- Nginx与Serssion一致性问题
- SU Demos-05Sorting Traces-03susorty
- 哈佛博士生经验分享:10种方法让你在读博阶段更加轻松愉快
- Linux中点号,星号,加号,问号实战
- ThinkPHP RBAC如何自动获取所有模块的函数
- C#笔记09 结构、枚举、异常、泛型、操作符重载、dll、垃圾回收与资源清理、XML注释
- c语言 搜索彩票期数,根据福利彩票的规则用c++编写一个买彩票开奖的程序,求程序代码,谢谢...
- JSP 九大内置对象及四个作用域详解
- 高等数学教材上册复习
- php 函数名,php里函数名或者方法名前加 符号表示的意思
- oracle web创建表空间,oracle 创造表空间常用
- 新款 Mac mini(2018) 性能及接口分析
- 三星ml1660拆机图解_三星s6拆机图解介绍
- 攻防世界 Web-mfw
- 习题 3.12 给出一个不多于5位的正整数,要求:1. 求出它是几位数;2. 分别打印出每一位数字;3. 按逆序打印出各位数字,例如原数位321,应输出123。