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还能保留这些变量。


Android蓝牙编程经验总结——同时传输数据和音频_第1张图片

你可能感兴趣的:(android网络编程,android,UI,android)