Android 蓝牙

[Bluetooth]: android 平台上BLE连接流程之优化方案 文章提供了一种设计良好的蓝牙连接(重连)的流程逻辑,可以极大的提高Android平台上蓝牙设备的连接成功率。 阅读详情

概念:

蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。

如今蓝牙由蓝牙技术联盟(Bluetooth Special Interest Group,简称SIG)管理。蓝牙技术联盟在全球拥有超过25,000家成员公司,它们分布在电信、计算机、网络、和消费电子等多重领域。IEEE将蓝牙技术列为IEEE 802.15.1,但如今已不再维持该标准。蓝牙技术联盟负责监督蓝牙规范的开发,管理认证项目,并维护商标权益。制造商的设备必须符合蓝牙技术联盟的标准才能以“蓝牙设备”的名义进入市场。蓝牙技术拥有一套专利网络,可发放给符合标准的设备。


操作:

权限

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"/>


一、获取蓝牙


//获取默认的 bluetootAdapter
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();

    BluetoothAdapter的属性打开时才能够读取和更改(设备启用状态),如果该设备关闭,那么这些方法将返回空。

二、判断设备开起,更改设备信息

 //当蓝牙开启时
           
if(bluetooth.isEnabled()){
               //蓝牙地址
               
String address = bluetooth.getAddress();
               
//蓝牙名称
               
String name = bluetooth.getName();
               
Toast.makeText(this,"Address:"+address+" name:"+name,Toast.LENGTH_LONG).show();
               
//蓝牙设备开启时并且添加 BLUETOOTH_ADMIN 权限 可以对蓝牙进行名称设定
//                bluetooth.setName("挖掘机哪家强");
               //扫描蓝牙设备
               
blueToothScan();
           
}else{
               //当蓝牙未开启时
               
Toast.makeText(this,"蓝牙未开启",Toast.LENGTH_LONG).show();
               
//弹出提示用户打开蓝牙
               
startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), START_BLUETOOTH);
           
}

   打开返回

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);

   
//打开蓝牙返回
   
if(requestCode== START_BLUETOOTH &&resultCode==RESULT_OK){
      Toast.makeText(this,"打开蓝牙",Toast.LENGTH_SHORT).show();
   
}  
}

 三、注册打开蓝牙广播

//注册蓝牙打开广播
registerReceiver(bluetoothState,new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
/**
    * 创建蓝牙监听广播
    */

   
BroadcastReceiver bluetoothState = new BroadcastReceiver() {
       @Override
       
public void onReceive(Context context, Intent intent) {

           int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
           int
previousState = intent.getIntExtra( BluetoothAdapter.EXTRA_PREVIOUS_STATE, -1);

//            int state = bluetooth.getState();
           
switch (state){
               case BluetoothAdapter.STATE_TURNING_ON:
                   //打开中
                   
break;
               case
BluetoothAdapter.STATE_ON:
                   //已打开
                   
break;
               case
BluetoothAdapter.STATE_TURNING_OFF:
                   //关闭中
                   
break;
               case
BluetoothAdapter.STATE_OFF:
                   //已关闭
                   
break;
           
}
       }
   };


四、注册可被扫描广播

//注册可被扫描广播
registerReceiver(bluetoothScan,new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED));

//扫描状态广播
BroadcastReceiver bluetoothScan=new BroadcastReceiver() {
   @Override
   
public void onReceive(Context context, Intent intent) {
       int prevMode = intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_SCAN_MODE, -1);
       int
scanMode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, -1);

       switch
(scanMode){
           case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
               //启用查询扫描和页面扫描,意味着该设备可被任何执行发现扫描的蓝牙设备发现
               
break;
           case
BluetoothAdapter.SCAN_MODE_CONNECTABLE:
               //启用页面扫描但禁用查询扫描。这意味着之前连接并绑定到本地设备的设备可以在发现过程中找到,但找不到新设备
               
break;
           case
BluetoothAdapter.SCAN_MODE_NONE:
               //可发现性被关闭,再发现过程中没有一个远程设备能够找到本地设备
               
break;
       
}
   }
};
/**
* 开始扫描
*/
private void blueToothScan(){
   int scanMode = bluetooth.getScanMode();
   if
(scanMode==BluetoothAdapter.SCAN_MODE_NONE){
       //设置设备可以被发现
       
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
       
//设置可发现时间
       
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,60);
       
startActivityForResult(intent, START_DISCOVERABLE);
   
}else{
       //是否正在扫描,正在扫描取消扫描
       
mDeviceAdapter.clearDevice();
       if
(!bluetooth.isDiscovering()){
          bluetooth.startDiscovery();
       
}else{
           //停止扫描
           
bluetooth.cancelDiscovery();
           
//开始扫描
           
bluetooth.startDiscovery();
       
}
   }
}

五、注册开始扫描和结束扫描广播

//注册扫描开始
registerReceiver(discoveryMonitor,new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED));
//注册扫描结束
registerReceiver(discoveryMonitor,new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
BroadcastReceiver discoveryMonitor = new BroadcastReceiver() {
   @Override
   
public void onReceive(Context context, Intent intent) {
       if(BluetoothAdapter.ACTION_DISCOVERY_STARTED==intent.getAction()){
           Log.i(TAG,"开始扫描 start");
       
}else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED==intent.getAction()){
           Log.i(TAG,"结束扫描 finish");
       
}
   }
};

六、注册设备扫描结果

//注册设备扫描结果
registerReceiver(discoveryResult,new IntentFilter(BluetoothDevice.ACTION_FOUND));
//扫描结果
BroadcastReceiver discoveryResult = new BroadcastReceiver() {
   @Override
   
public void onReceive(Context context, Intent intent) {
       //名称
       
String remoteName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
       
//设备
       
BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
       
mDeviceAdapter.addDevice(remoteDevice);
   
}
}

七、退出时unRegisterReceiver

@Override
protected void onDestroy() {
   unregisterReceiver(bluetoothState);
   
unregisterReceiver(bluetoothScan);
   
unregisterReceiver(discoveryMonitor);
   
unregisterReceiver(discoveryResult);
   super
.onDestroy();
}

安卓蓝牙文件传输完整指南 安卓蓝牙文件传输是指安卓设备能够在两个蓝牙设备之间无线传输文件,如照片、视频、文档等。这种文件传输方法简化了通过蓝牙发送文件的过程,无需额外应用程序。它与许多设备兼容,但不支持iOS或ChromeOS。支持此功能的安卓设备有一个名为“蓝牙共享”的设置。Chrome OS 89为Chromebook和安卓设备引入了“附近共享”功能。此外,与USB数据线、OTG数据线、U盘、个人热点、媒体中心、WiFi Direct、云存储/电子邮件和文件传输应用程序相比,蓝牙具有优势。 阅读详情

相关推荐

安卓APP蓝牙上位机的编写一——APP结构

安卓APP蓝牙上位机开发的第一步

weixin_42119432的博客 1万+

android 蓝牙功能,Android.bluetooth 功能解析【转自优快云】

android.bluetooth提供了皆如扫描设备、连接设备以及对设备间的数据传输进行管理的类,这些类对蓝牙设备进行功能性管理。蓝牙模块API提供的应用包括了:●扫描其它蓝牙设备●通过查询本地蓝牙适配器来匹配蓝牙设备●建立RFCOMM(无线射频通信协议)的通道/端口●从其他的蓝牙设备中连接到指定的端口●传输数据到其他设备,或者从其他设备中接收数据如需运用这些API来执行蓝牙通信,应用程序必须声明...

weixin_33514221的博客 1990

Android模拟蓝牙蓝牙键盘——适配Android和Windows

学校寒假有个程序设计比赛,我也一直想要去写一个安卓模拟的蓝牙键盘,这样无论到哪里,比如班班通和没有键盘的电脑设备,有手机就可以操作它,也比USB方便一些。忙活了一个寒假,也走了不少歪路,终于整成了,下面分享一些经验。优快云上大佬真的很多!

FengyunTHU的博客 6982

android 开发之 Bluetooth

android  蓝牙串口连接代码   BluetoothSocket tmp =null;   // Get a BluetoothSocket for a  connection with the   // given BluetootDevice   try{          tmp= device.createRfcommSocketToServiceRecord

Charlene1688的专栏 564

概率论与数理统计基础概念与重要定义汇总

文章目录一、随机事件和概率1:互斥,对立,独立事件的定义和性质。2:概率,条件概率和五大概率公式3:古典型,几何型概率和伯努利试验 一、随机事件和概率 1:互斥,对立,独立事件的定义和性质。 互斥事件\color{red}\textbf{互斥事件}互斥事件 事件A和B的交集为空,A与B就是互斥事件,也叫互不相容事件。也可叙述为:不可能同时发生的事件。如A∩B为不可能事件(A∩B=Φ),那么称事件A与事件B互斥,其含义是:事件A与事件B在任何一次试验中不会同时发生。 则P(A+B)=P(A)+P(B)(这个公

csyifanZhang的博客 1万+

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

本文介绍了在Ubuntu 24.04上安装和使用GDebi的方法。GDebi是DPKG的轻量级替代品,能够自动解析并安装.deb包的依赖项。文章详细说明了系统更新、安装GDebi的步骤,并演示了通过GUI和CLI两种方式安装.deb包的操作流程。此外,还提供了验证安装和卸载包的方法。GDebi虽然非必需,但为用户提供了处理依赖项的另一种选择,适合需要安装本地Debian包的用户。

山岚的运维笔记 1989

Android开发之蓝牙通信(二)

接着上篇蓝牙通信往下写,本篇准备深入理解蓝牙通信模块源码,若有不对还请指出,大家共同进步。

AnalyzeSystem的博客 4681

详细Ubuntu 22.04 配置最新UR机械臂仿真环境(ros2-humble, ur-sim, ur-ros2-driver)

使用ubuntu22.04.01和ur-sim, ur-driver进行ur机械臂的仿真

verloge的博客 1万+

android 蓝牙游戏下载,安卓手机蓝牙弹窗

安卓手机蓝牙弹窗是一款非常实用的设置软件,界面简单明了,操作十分容易,在这款软件中有超多的功能系统,用户可以在上面随时查看电量使用情况,还能根据自己的喜好设置功能控制,还在等什么,感兴趣的小伙伴们赶紧下载体验吧。安卓手机蓝牙弹窗软件介绍irPods在Android端电量查看工具(可弹窗,免费、无广告)AndPods是为了解决Android用户使用AirPods蓝牙耳机无法查看电量等信息而开发的一款...

weixin_29243279的博客 1010

在 Windows 10 中通过 WSL2 安装 vLLM 部署本地大模型的方法和步骤

通过 WSL2 在 Windows 10 中部署 vLLM 的核心优势是兼顾 Windows 生态与 Linux 环境的 GPU 加速能力,适合需要在 Windows 下开发但依赖 vLLM 高性能推理的场景。相比原生 Windows 部署(Ollama 等工具),该方案性能更优(接近原生 Ubuntu),且支持更大模型和量化优化。若追求极致性能,建议直接使用 Ubuntu 系统;若必须依赖 Windows 工具链,WSL2 + vLLM 是当前最优选择。

当 AI 开始写文章、绘星空,甚至预测未来,您还在旁观吗?这里将剖开人工智能的思考逻辑,拆解 AI 创作的底层密码,也聊聊人工智能里的人文温度。每篇都有让你拍案的细节,快来解锁 AI 时代的神奇世界! 3754

麒麟桌面操作系统QT开发环境搭建

麒麟操作系统安装Qt

因为热爱,所以坚持,记录工作中的乐趣 9275

android苹果蓝牙版本,苹果蓝牙和安卓蓝牙能连吗

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。苹果蓝牙和安卓蓝牙能连:1、首先,在的苹果手机的设置,找到蓝牙,然后打开它;2、接着,拿起安卓手机,找到设置里的蓝牙,点击一下;3、将安卓的蓝牙打开后,下面会出现“可被发现”按钮打开;4、接着下面自动出现附近打开的蓝牙;5、找到要连接的苹果手机的蓝牙名称,点击一下;6、接着就会出现一个小框框,点击配对;7、然后在苹果手机上也会发现...

weixin_31992389的博客 4953

C# 与欧姆龙 PLC 实战:通过 Ethernet/IP 协议进行设备控制与监控

本文介绍了如何通过C#和Ethernet/IP协议实现与欧姆龙PLC的通信。Ethernet/IP是基于以太网的工业协议,适用于工业设备间的实时数据交换。文章详细讲解了使用EthernetIPSharp库建立连接、读写数据的步骤,并提供了示例代码。此外,还探讨了实时监控、报警系统等高级功能,为工业自动化控制系统开发提供了实用指导。该方法简化了PLC通信开发,提高了系统可靠性和智能化程度。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 813

android蓝牙动态权限,安卓蓝牙动态权限

安卓蓝牙动态权限安卓7.0及以下版本在 IDE 的 Project - Options 菜单弹出来的窗口里面,找到左边树结构的: Application -- Uses Permissions 项目,则右边会出来一堆权限让你打勾。这里要勾选上 Bluetooth 和 Bluetooth admin 两项。老的安卓版本,勾选这两项就可以了。安卓8.0及以上版本,还需要运行期用代码动态申请权限。代码里...

weixin_29014237的博客 2735

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1220

内存越界一定会导致程序崩溃吗?详解内存越界

本文详细解释了内存越界不一定导致内存越界的问题,全面介绍了C++内存越界的相关内容。

dvlinker的技术专栏 2万+

android tv 蓝牙服务_安卓系统蓝牙服务com.android.bluetooth的使能

蓝牙系统服务层的使能流程分析蓝牙服务层的使能基础是其初始化完成,也就是AdapterService通过onBind()将AdapterServiceBinder上报给bind该服务的调用者。我们现在应该都知道在安卓系统中bind该服务的为BluetoothManagerService。本篇我们就从蓝牙服务管理收到bind的回调开启蓝牙使能流程的分析。熟悉安卓系统中bind服务机制的小伙伴应该都知道...

weixin_42347763的博客 798

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android+蓝牙遥控器,一种通过蓝牙遥控安卓设备的方法与流程

本发明涉及安卓系统遥控领域,具体公开了一种通过蓝牙遥控安卓设备的方法。背景技术:随着数字技术的发展,人们使用的数字设备日新月异。现在最为常见的个人设备操作系统是安卓系统。对安卓设备控制的方式,最常见的就是通过安卓设备的触摸屏直接触控的方式进行交互控制,交互方便、快捷。然而在实际生活中有很多时候不方便直接去点击屏幕操作(如开车的时候),这时如果有一个控制器可以实现对安卓设备进行短距离的遥控,可以极大...

weixin_32329059的博客 3897

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

安卓蓝牙框架汇总

1.  从蓝牙数据和控制信令流程层次图看蓝牙底层协议栈 2. Android Version1 蓝牙框架 3.  从库的角度看安卓蓝牙架构 4.   Android N  蓝牙框架

嵌入式移动开发 4053

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

安卓 禁用 蓝牙_警告:部分ANDROID用户应禁止使用任何蓝牙配件

原标题:警告:部分ANDROID用户应禁止使用任何蓝牙配件如果你有一款安卓手机,并且使用蓝牙配件(比如三星Galaxy Buds无线耳机或者谷歌Pixel Buds无线耳机),那么在你的手机上启用蓝牙功能的时候,你可能要三思了。安全公司警告:部分Android用户应禁止使用任何蓝牙配件 最近,国外安全公司ERNW在安卓蓝牙子系统中发现了一个漏洞,可以让任何在你设备蓝牙范围内的人在你不知情的情况下黑...

weixin_39531229的博客 837

android蓝牙键盘编辑,使用很麻烦 安卓系统蓝牙键盘使用技巧

【IT168 技术】安卓系统在蓝牙键盘支持方面就真是惨不忍睹了,因为很多原生安卓rom并没有集成HID蓝牙设备,对蓝牙键盘这类产品支持上存在不少缺陷。也导致目前市面上大多数的平板或者手机键盘只能服务苹果的产品。蓝牙无线技术是一个通用型的技术,没有理由区分Android和苹果。笔者在网上搜罗了一下安卓系统使用蓝牙键的方法,得到的结论是,改变底层的文件让安卓系统能识别并使用蓝牙键盘。之前笔者评测过的雷...

weixin_34902728的博客 2638

安卓蓝牙驱动apk_安卓手机文件互传

怎么不借用第三方工具,安卓手机实现相互文件快传呢?苹果:首先不用多说,苹果可以使用Air Drop功能,苹果全家桶可以无障碍互传。长期以来,除开微信和QQ,不同品牌安卓手机互传文件依靠的途径只有蓝牙。到了现在这个阶段,蓝牙早已不是什么稀奇的玩意,所以它是最简单也是最唾手可得的互传文件的方法。然而,即使是现在最新的蓝牙5.0标准,它的理论最大传输速度也只有24Mbps,即3MB/s,约等于...

weixin_39567943的博客 1万+

Android蓝牙ble编程,蓝牙防丢器实现安卓的BLE接口编程

原标题:蓝牙防丢器实现安卓的BLE接口编程 蓝牙防丢profile1.TXP(txpower) Characteristic, 设备端需要通过主机控制接口HCI来获得发射功率参数,并以read属性提供给master。2.IAS(immediate alter service), write属性,供master写告警级别。当master写入新的值时,设备端会收到write的回调,其根据告警级别进行相...

weixin_28811055的博客 631

ktm390蓝牙连接安卓_Android 蓝牙广播、连接

最近因为公司的需求,要开发蓝牙的智能设备,通过网上查找资料,终于实现了蓝牙连接,通信的功能。重点1:蓝牙连接其实是不需要配对的!!!重点2:高版本Android系统,需要设置动态权限,除了蓝牙的一些控制权限,蓝牙搜索还需要定位权限。蓝牙状态广播,可以获取蓝牙打开,关闭状态。/*** 广播监听蓝牙状态*/public class BlueToothValueReceiver extends Broa...

weixin_33918788的博客 1371

android 9 蓝牙源码_蓝牙音乐SRC侧的安卓实现

蓝牙音乐SRC侧的安卓实现随着电子产品的普及,越来越多的年轻人热衷于使用蓝牙技术来播放歌曲(相当多的手机品牌取消了耳机插孔 [狗头]),本篇文章就和大家聊聊蓝牙音乐SRC端在安卓系统中的实现原理。安卓系统参考版本:Android-9蓝牙SRC侧播放蓝牙音乐,音频数据都是从安卓音频系统发送过来的,蓝牙协议栈接收到音频数据处理再发送到SNK端进行播放,整体的流程大概如下图所示:红色框图标注的部分就是我...

weixin_35828255的博客 641
上一篇: Android5.0+(Percent 百分比布局)
下一篇: Android 图片二次采样、质量压缩
dalongjun
博客等级 码龄11年 3粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值