Android蓝牙编程经验总结——同时传输数据和音频_android spp 传输音乐-程序员宅基地

技术标签: android UI  android网络编程  蓝牙同时传数据和音频  

写给自己的总结,不是教学文章,仅供参考。


先是蓝牙编程基础,参考之前写的这篇:

http://blog.csdn.net/xzongyuan/article/details/39319691


这篇主要总结BluetoothSocket的编程经验,因为在这块花了好几天去调试。

首先,Android的Setting app会自动连接已经Pair过的蓝牙。但是它连的只是之前连接过的协议。而且,如果你关了蓝牙,却没关APP,会出现很多奇怪现象。例如:通过Socket端口的OutputStream写数据,时会报错,写不入。原因如下:

/* 如果出现写入错误,那肯定是写入了先前没有关闭的Socket。
*  这种情况出现在:
* 关闭了蓝牙,但是APP还开着,这时Socket处于disConnect状态,但Socket及其对应的OutputStream都不为null。
* 所以当你再次点击按钮,就会显示写入错误。这时,外围蓝牙设备状态是怎样的?当你关闭蓝牙,外围设备的Socket已经重设为null,
* 没有对应先前的Socket了,即使你再次开蓝牙,系统自动连接,也只是连接了音频,而SPP还是需要重连的。
* 重连的办法就是先close现在拥有的Scoket,然后自动重连。这时因为音频socket已经自动连上了,ConnectThread中
* 连接A2DP的部分就不会有什么影响,只会完成新socket的连接。
*/

这样一个小问题,直接影响了App的人性化设计。在解决这个问题之前,有时候音频A2DP被自动连上了,但是SPP协议就是没连上,导致我发送的控制命令无法传递。那APP相当于废掉了,而且关闭蓝牙也没效果,必须通过系统杀死APP,重开APP。解决办法是:一旦OutputStream写入错误,就close掉,当前的Socket,并重开一个Socket。


1为了管理Socket和蓝牙,我专门设计了一个BTController类,所以网络相关的变量都在这。主要实现如下功能:

1.1.获取全局共享的BluetoothSocket、BlutoothAdpater。

1.2.获取全局共享的OutputStream

1.3.控制Thread——网络连接需要单独的Thread。因为我设计了Service和Activity,两者都要控制UI和蓝牙功能,所以最好共用一个Thread。


2.为了可以在静态函数中new一个Thread,需要参考这篇日志http://blog.csdn.net/xzongyuan/article/details/39548113。

2.1 如下图,我写了一个ConnectThread。1.3中提到的Thread就是指这个。因此,只有一个全局ConnectThread。


3.FlowLayoutView.java是一个悬浮窗控件。


4.这个悬浮窗需要实现控制Android音频的功能,而且还要实现隐藏显示某些子view,因此,我设计了一个单独的Controller类。


5.WindowManagerData.java主要是提供悬浮窗所需要的参数和函数。


6.AudioDetectService主要是创建上面提到的那些实例,我的一个想法是关闭Activity后,Service还能保留这些变量。



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xzongyuan/article/details/39579435

智能推荐

DirectUI----Become windowless 译文_directui文字超链接-程序员宅基地

文章浏览阅读3.2k次。原文地址:http://www.viksoe.dk/code/windowless1.htmA request on the Yahoo WTL newsgroup and a blog-article sparked some interest to look closer at creating a windowless user-interface. Traditionall_directui文字超链接

Linux下Java环境安装(含卸载)_linux下安装java流程图-程序员宅基地

文章浏览阅读145次。https://www.cnblogs.com/xuejiale/p/10504845.html_linux下安装java流程图

带你了解LVGL:一个开源的嵌入式图形库-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏36次。本文的目的是介绍一个开源的嵌入式图形库- LVGL(Light and Versatile Graphics Library)。LVGL是一个适用于各种嵌入式平台和显示器的GUI库,它提供了丰富的控件、主题、动画、字体、图像等元素,以及灵活的布局和事件处理机制。本文将介绍LVGL的主要特点、架构、使用方法和应用领域,并且展示一些LVGL的示例和效果。_lvgl

【UE4 Animation】动画编辑器制作倒放动画效果_虚幻动画编辑器制作倒放动画效果怎么设置-程序员宅基地

文章浏览阅读4.4k次,点赞3次,收藏4次。原动画倒播动画如何制作最近使用动画编辑器倒播录制了一个箱子爆炸的动画,达到了物体复原的魔法效果。在动画编辑器中打开箱子爆炸动画,下方点击快退即可看到动画已经倒播了。点击录制,选择新建的资源路径。录制到想要的动画片段后,再次点击停止录制。打开刚录制的新动画资源后,通过下方的关键帧编辑界面可以删除重复或者不想要的关键帧片段,由此得到的就是倒播动画。..._虚幻动画编辑器制作倒放动画效果怎么设置

Java从键盘获取用户输入_获取键盘输入的用户信息-程序员宅基地

文章浏览阅读1.5k次。Java从键盘获取用户输入_获取键盘输入的用户信息

matlab求向量的二范数_Python Numpy中的范数-程序员宅基地

文章浏览阅读2.7k次。数学概念 范数,是具有 “长度” 概念的函数。在线性代数、泛函分析及相关的数学领域,范数是一个函数,是矢量空间内的所有矢量赋予非零的正长度或大小。在数学上,范数包括向量范数和矩阵范数L1 范数和 L2 范数,用于机器学习的 L1 正则化、L2 正则化。对于线性回归模型,使用 L1 正则化的模型叫做 Lasso 回归,使用 L2 正则化的模型叫做 Ridge 回归(岭回归)。其作用是:L1..._matlab 向量二范数

随便推点

ASP.NET 2.0 调用ASPJpeg组件生成文字水印_aspjpeglib-程序员宅基地

文章浏览阅读614次。using System.Reflection;//FLYSO Blog//加水印ASPJPEGLib.IASPJpeg flysoJpeg = new ASPJPEGLib.ASPJpeg();// 源图片路径String strPath = Server.MapPath("www.flyso.net");// 打开源图片flysoJpeg.Open( st_aspjpeglib

2-2 Coursera吴恩达《改善深度神经网络》第二周课程笔记-优化算法-程序员宅基地

文章浏览阅读3.1k次,点赞7次,收藏6次。上节课2-1 Coursera吴恩达《改善深度神经网络》 第一周课程笔记-深度学习的实践方面我们主要介绍了如何建立一个实用的深度学习神经网络。包括Train/Dev/Test sets的比例选择,Bias和Variance的概念和区别:high bias对应欠拟合,high variance对应过拟合。接着,我们介绍了防止过拟合的两种方法:正则化(如L2 regularization)和Dropout。然后,介绍了如何进行标准化输入,以加快梯度下降速度和精度。然后,我们介绍了梯度消失和梯度爆炸的概念和危害,

jmeter压测mysql性能_jmeter 测试mysql性能测试需要多线程么-程序员宅基地

文章浏览阅读216次。jmeter版本:apache-jmeter-4.0将mysql-connector-java-5.1.30-bin.jar放入到apache-jmeter-4.0\lib目录下。启动jmeter:进入apache-jmeter-4.0\bin目录下,双击ApacheJMeter.jar1、添加线程组右击【测试计划】,点击【添加】,点击【Theads(Users)】,点击【线程组】点击刚添加的线程组,将【名称】改为:数据库压测将【线程数】调整为:10将【Ramp-Up P_jmeter 测试mysql性能测试需要多线程么

windows7无法自动修复计算机怎么办,win7电脑自动修复不了开不了机怎么办-程序员宅基地

文章浏览阅读8.1k次,点赞5次,收藏7次。windows系统自带有自动修复功能,可以有效的解决一些系统故障问题,不过很多时候靠自动修复无法解决系统故障问题。如果win7电脑自动修复不了,win7开不了机怎么办呢?下面小编就教下大家win7电脑自动修复不了开不了机的解决方法。具体步骤如下:1、开启电脑时,快速频繁按下键盘上的F8键,调出高级启动选项菜单。2、一般如果可以正常进入系统,就会进行开机动画界面了,如果可以成功开机,我们还可以进入系..._windows7未能启动怎么修复

最小生成树算法之Prim(普里姆)算法_最小生成树prim算法-程序员宅基地

文章浏览阅读2.7w次,点赞103次,收藏510次。最小生成树的可以通过Kruskal(克鲁斯卡尔)算法或Prim(普里姆)算法求出。Prim算法基本介绍:Prim算法又称为"加点法",每次找出距离(此处的距离指的是距离最小生成树的距离,若此处无法理解,可直接跳过,看完下面例子就能理解)最小的边对应的点。算法逐渐从某一个顶点s开始,逐渐将n个点纳入最小生成树中。Prim算法基本步骤:第一步:设图中所有顶点的集合为V,u代表已经加入最小生成树的顶点的集合,v代表未加入最小生成树的顶点的集合,最由于从某点s开始,因此u={s},v={V-u}_最小生成树prim算法

java.io.FileNotFoundException: class path resource [spring/applicationContext.xml] cannot be opened-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏9次。 标题没贴完整,这里补充下异常情况:java.io.FileNotFoundException: class path resource [spring/applicationContext.xml] cannot be opened because it does not exist这是一个很奇葩的问题,好多原因都可以导致这种问题,还有一点就是clean及package后启动Tomcat...