蓝牙监听与连接

AndroidManifest.xml

 <!--蓝牙权限--><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /><uses-permission android:name="android.permission.BLUETOOTH_SCAN" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

注册广播接收者监听蓝牙状态:

  try {if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 1);}//获取 BluetoothHeadset 代理// bluetoothAdapter.getProfileProxy(getApplicationContext(), serviceListener, BluetoothProfile.HEADSET);isSupportBluetooth();isBtConDeviceByMac();IntentFilter filter = new IntentFilter();filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);filter.addAction(BluetoothDevice.ACTION_FOUND);filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);    //绑定状态监听filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);registerReceiver(bluetoothReceiver, filter);} catch (Exception e) {e.printStackTrace();}

连接那一块儿的代码好像不能用。

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();private static final String tagBlt = "BluetoothA";public void isSupportBluetooth() {if (bluetoothAdapter == null) {Log.d(tagBlt, "设备不支持蓝牙");}if (!bluetoothAdapter.isEnabled()) {Log.d(tagBlt, "蓝牙未启用");} else {Log.d(tagBlt, "蓝牙已经启用");}}BluetoothDevice deviceConnect;//经典蓝牙连接状态public void isBtConDeviceByMac() {//String strCurBtMacString deviceName = "";String deviceAddress = "";try {Class<BluetoothAdapter> bluetoothAdapterClass = BluetoothAdapter.class;Method method = bluetoothAdapterClass.getDeclaredMethod("getConnectionState", (Class[]) null);method.setAccessible(true);int state = (int) method.invoke(bluetoothAdapter, (Object[]) null);if (state == BluetoothAdapter.STATE_CONNECTED) {Log.d(tagBlt, "BluetoothAdapter.STATE_CONNECTED已经连接");if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();Log.d(tagBlt, "已经配对的设备数量" + devices.size());for (BluetoothDevice device : devices) {Method isConnectedMethod = BluetoothDevice.class.getDeclaredMethod("isConnected", (Class[]) null);method.setAccessible(true);boolean isConnected = (boolean) isConnectedMethod.invoke(device, (Object[]) null);if (isConnected) {deviceConnect = device;deviceName = device.getName();deviceAddress = device.getAddress();Log.d(tagBlt, "已经连接的设备名称:connected:" + deviceName + ", 地址:" + deviceAddress);// 保存设备信息以便后续使用saveConnectedDeviceInfo(deviceName, deviceAddress);}}}if (state == BluetoothAdapter.STATE_DISCONNECTED) {Log.d(tagBlt, "连接状态" + state);Log.d(tagBlt, "你好");// connectToDevice(deviceConnect);}// Log.d("Bluetooth", "连接状态"+state);} catch (Exception e) {e.printStackTrace();}}public void connectToDevice(BluetoothDevice device) {BluetoothSocket bluetoothSocket = null;try {// 使用设备的 UUID 创建 BluetoothSocketUUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // 通用串口服务的 UUIDif (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);// 连接到设备bluetoothSocket.connect();Log.d(tagBlt, "连接成功: " + device.getName());// 这里可以进行数据传输} catch (IOException e) {Log.e(tagBlt, "连接失败: " + e.getMessage());try {if (bluetoothSocket != null) {bluetoothSocket.close();}} catch (IOException closeException) {Log.e(tagBlt, "关闭连接失败: " + closeException.getMessage());}}}private HashMap<String, String> connectedDevices = new HashMap<>();private void saveConnectedDeviceInfo(String name, String address) {connectedDevices.put(name, address);}/*  Handler handler=new Handler();Runnable bltConnectRunnable=  new Runnable() {@Overridepublic void run() {connectToDevice(deviceConnect);Log.d(tagBlt,"正在执行连接");handler.postDelayed(this,5000);}};handler.post(bltConnectRunnable);*/private BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final String action = intent.getAction();// BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (BluetoothDevice.ACTION_FOUND.equals(action)) {Log.d(tagBlt, "蓝牙设备已发现");} else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {// 蓝牙设备已连接Log.d(tagBlt, "蓝牙设备已连接");} else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {Log.d(tagBlt, "蓝牙设备正准备断开连接");} else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {// 蓝牙设备已断开Log.d(tagBlt, "蓝牙设备已断开可以执行一些操作了");Log.d(tagBlt, "可以执行一些操作了");// 触发重连逻辑if(deviceConnect!=null){connectToDevice1(deviceConnect);Log.d(tagBlt, "deviceConnect不为null,已经调用connectToDevice1方法了");}else{Log.d(tagBlt, "deviceConnect为null,并没有调用connectToDevice1");}}if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);switch (state) {case BluetoothAdapter.STATE_OFF:Log.d(tagBlt, "蓝牙已关闭22");break;case BluetoothAdapter.STATE_ON:Log.d(tagBlt, "蓝牙已开启22");break;case BluetoothAdapter.STATE_TURNING_OFF:Log.d(tagBlt, "蓝牙正在关闭22");break;case BluetoothAdapter.STATE_TURNING_ON://Toast.makeText(context, "蓝牙正在开启22", Toast.LENGTH_SHORT).show();Log.d(tagBlt, "蓝牙正在开启22");break;}}}};private BluetoothGatt bluetoothGatt;public void connectToDevice1(BluetoothDevice device) {if (bluetoothGatt != null) {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}bluetoothGatt.disconnect();bluetoothGatt.close();Log.d(tagBlt, "bluetoothGatt != null");}if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}bluetoothGatt = device.connectGatt(this, false, gattCallback);Log.d(tagBlt, "bluetoothGatt = device.connectGatt(this, false, gattCallback);");}private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {@Overridepublic void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {if (newState == BluetoothGatt.STATE_CONNECTED) {// 连接成功if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}gatt.discoverServices(); // 发现服务Log.d(tagBlt, "discoverServices");} else if (newState == BluetoothGatt.STATE_DISCONNECTED) {// 连接断开// 可以在这里实现重连逻辑Log.d(tagBlt, "---BluetoothGatt.SSTATE_DISCONNECTED");}}@Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {Log.d(tagBlt, " BluetoothGatt.GATT_SUCCESS");}}// 其他回调方法可以根据需要实现};public void disconnect() {if (bluetoothGatt != null) {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}bluetoothGatt.disconnect();bluetoothGatt.close();bluetoothGatt = null;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12755.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

免费数字孪生平台打造物流数据可视化大屏,助力消费跑出加速度

在当今快速发展的时代&#xff0c;物流行业已成为连接生产与消费的重要桥梁。2024年&#xff0c;中国物流行业再次刷新纪录&#xff0c;8月13日&#xff0c;我国第1000亿件快递已顺利产生&#xff0c;比2023年提前了71天&#xff0c;这一速度令人惊叹。而在这背后&#xff0c;物…

Navict15 过期处理删除注册表

1.winR 注册表输入regedit 2.搜索输入HKEY_CURRENT_USER\Software\PremiumSoft\Navicat 3.输入HKEY_CURRENT_USER\Software\Classes\CLSID&#xff0c;找到只有一个info的&#xff0c;把包含info的这个文件夹删了。

计算机网络:运输层 —— TCP/IP运输层中的两个重要协议

文章目录 TCP 协议工作方式建立连接&#xff08;三次握手&#xff09;释放连接&#xff08;四次挥手&#xff09; 首部格式 UDP 协议首部格式适用场景 TCP 与 UDP 的对比无连接的UDP和面向连接的TCP对单播、多播和广播的支持情况对应用层报文的处理对数据传输可靠性的支持情况U…

OpenCV4.8 开发实战系列专栏之 13 - 图像翻转(Image Flip)

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点&#xff1a;图像翻转(Image Flip) 图像翻转的本质像素映…

内网基本概念及知识

参考&#xff1a; 微信公众号&#xff1a;网络安全自修室 1. 内网概述 内网也指局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;&#xff0c;即在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理&#xff0c;应用软…

【JAVA】使用IDEA创建maven聚合项目

【JAVA】使用IDEA创建maven聚合项目 1.效果图 2.创建父模块项目 2.1删除父模块下面的src目录以及不需要的maven依赖 3创建子模块项目 3.1右击父模块项目选择Module… 3.2创建子模块 3.3删除子模块下不需要的maven依赖 4.子模块创建完成后引入SpringBoot依赖启动项目

wordpress搭建主题可配置json

网站首页展示 在线访问链接 http://dahua.bloggo.chat/ 配置json文件 我使用的是argon主题&#xff0c;你需要先安装好主题&#xff0c;然后可以导入我的json文件一键配置。 需要json界面配置文件的&#xff0c;可以在评论区回复&#xff0c;看见评论我会私发给你。~

员工利用公司资源做自己生意违法吗?怎么预防?答案揭秘:违法!只需这样做!

各位企业大佬们&#xff0c;你的员工有没有心怀不轨&#xff0c;试图利用职务之便&#xff0c;将公司的资源挪作私用&#xff0c;甚至做起自己的生意呢&#xff1f; 老板&#xff1a;这把心酸泪&#xff0c;我都不想说...... 那么&#xff0c;员工利用公司资源做自己生意是否违…

模型再训练软件环境部署说明

什么时候需要看这个文档&#xff1f; 使用exe在windows预测或者训练paddleClas模型时候&#xff0c;本地环境配置的时候。 主机要求 硬件 系统&#xff1a;windows10以上Nvidia显卡数量&#xff1a;1&#xff08;仅支持单卡&#xff09;内存容量&#xff1a;至少32G硬盘容量…

ubuntu系统没有/var/log/messages日志文件解决方法

高版本ubuntu系统默认没有 /var/log/messages&#xff0c;因为在 /etc/rsyslog.d/50-default.conf 文件中&#xff0c;将其注释掉了。如下图 所以需修改该配置文件&#xff0c;将注释放开。 然后重启rsyslog服务即可。 systemctl restart rsyslog.service进入 /var/log/ 目录下…

Activity 通过Bundle与Fragment通信

目录 基础夯实&#xff1a;一、Activity与Fragment的关系二、通信场景三、通信方式1. 通过接口回调2. 通过Bundle3. 其他方式 四、注意事项 效果展示&#xff1a;实现功能&#xff1a;核心代码&#xff1a;MainActivityBlankFragment 基础夯实&#xff1a; Activity与Fragment…

体育活动赛事报名马拉松微信小程序开发

功能描述 体育活动赛事报名马拉松微信小程序&#xff0c;该项目是一个体育活动报名小程序&#xff0c;主要功能有活动报名、扫码签到、签到积分、排行奖励、积分兑换等功能。 用户端&#x1f536;登录&#xff1a;◻️1.微信授权登录 ◻️2.手机号码授权 &#x1f536;首页&am…

管家婆ERP集成金蝶云星空(管家婆主供应链)

源系统成集云目标系统 金蝶云星空介绍 金蝶云星空是金蝶软件&#xff08;中国&#xff09;有限公司研发的新一代战略性企业管理软件&#xff0c;致力于为企业提供端到端的供应链整体解决方案&#xff0c;它可以帮助企业构建敏捷供应链体系&#xff0c;降低供应链成本&a…

信捷 PLC C语言 POU 指示灯交替灭0.5秒亮0.5秒(保持型定时器)

1.在全局变量表中定义2个定时器变量timer_1,timer_2 名称 类型 timer_1 TMR_A_FB False -- False False timer_2 TMR_A_FB False -- False False ot2 BOOL False -- False False ot2表示指示灯 …

一文了解Mamba和选择性状态空间模型 (SSM)

一文了解Mamba和选择性状态空间模型 (SSM 前言SSMSSM简介深度学习中的SSM定义离散化SSM的递归方法SSM梯形法的基本原理离散过程重新整理并推导离散更新公式离散化后的矩阵表示 SSM卷积基本原理分析第一个方程分析第二个方程 Mamba&#xff1a;一种深度学习架构&#xff0c;专注…

SQL注入学习

SQL注入概念及产生原因 当web应用向后台数据库传递SQL语句进行数据库操作时&#xff0c;如果对用户输入的参数没有经过严格的过滤处理&#xff0c;那么攻击者就可以构造特殊的SQL语句&#xff0c;直接输入数据库引擎执行&#xff0c;获取或修改数据库中的数据。

【前端】深入浅出 - TypeScript 的详细讲解

TypeScript 是一种静态类型编程语言&#xff0c;它是 JavaScript 的超集&#xff0c;添加了类型系统和编译时检查。TypeScript 的主要目标是提高大型项目的开发效率和可维护性。本文将详细介绍 TypeScript 的核心概念、语法、类型系统、高级特性以及最佳实践。 1. TypeScript…

【Linux】Linux环境基础开发工具使用(下)

【Linux】Linux环境基础开发工具使用(下) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;Linux&#x1f34a; &#x1f33c;文章目录&#x1f33c; 4. Linux编辑器--gcc /g的使用 4.1 背景知识 4.2 gcc如何完成 4.2.1 预处理 4.2.2 编…

GPU性能测试,环境搭建笔记,transformers/huggingface_hub改国内源,BertLayer import 报错

代码&#xff0c;以及测试方案使用的是沐神的代码 github的代码&#xff1a; 1. 环境搭建 首先是安装torch 这是我的pytorch版本 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124使用pip指令安装transformers transformers…

PR剪辑视频去重消重色彩叠加特效模板

采用现代设计&#xff0c;灵感来自鲜艳的色彩和动态的灯光效果。包含颜色控制选项&#xff0c;能够轻松地调整效果以匹配您的视频风格。具有图像和视频替换功能。 易用性&#xff1a;适合所有经验水平的用户&#xff0c;包括初学者。 调色板自定义&#xff1a;完全控制颜色以匹…