Android开发学习秘籍笔记(十九)
吼,花了2天的时间做出了一个类似于蓝牙串口助手功能的小程序,其实也是实习公司的要求。有一个蓝牙无线蓝牙扫描枪,要求终端可以通过蓝牙连接到该设备,并且蓝牙无线扫描枪扫描二维码或者条形码的时候可以将二维码或者条形码的数据输出到TextView中。
效果:
听了上面的介绍是不是觉得很好做。说明下蓝牙扫描器的功能,有两个常用的模式--普通模式和SPP模式。普通模式的话就是蓝牙连接后,扫描枪就相当于外接的键盘,可以扫码然后将数据输出到EditText(必须活的焦点)。SPP模式则是用于模拟串口通信的,在我看来就是相当于开发者模式。
方案一:
在界面代码上下手脚,是一种投机取巧的方法。不是要显示在TextView上面嘛,不是扫码前要有获得焦点的EditText嘛。那我就在界面代码里面设置这两个控件,但是EditText设置其高度是1dp,除了开发人员自己知道这里有个EditText之外,使用者是不知道这里还有个EditText的,然后你就可以直接将EditText中的内容获取下来,再setText到TextView中去就可以了。
主要代码就只需要在EditText的setOnKeyListener
里设置就好了。
1 | et.setOnKeyListener(new EditText.OnKeyListener() |
操作很容易,思路也很清晰,简单粗暴!但是问题也很多,万一你一个界面有好多个EditText,比如登陆界面,除了你自己知道但别人看不到的EditText之外还得有两个EditText,一旦其中某一个获得光标,你的扫码枪就失去了意义,还有可能吓使用者一跳,所以这种方案不适合用在需要推送的APP上。
方案二:
蓝牙传输通信,具体就使用到了Android I/O流的传送方式,这种方式就很符合要求,就在你要传输数据的时候把你的数据截下来,然后我在相应的操作。我看了很多博客,大部分博客基本相似。这里放两篇经典的吧。
https://segmentfault.com/a/1190000004899799
http://www.cnblogs.com/wenjiang/p/3200138.html
具体的解释我会在代码里说,光说理论本人菜的抠脚。首先说说布局,超级简单,一个TextView,一个EditText(测试用的,用来做对比的),一个Button(可以根据自己的需求修改)。布局的代码就不贴了!实在不会就下实例看吧。
获取Android扫描到的蓝牙设备
DevicListAcitivity里面需要做的事情就是将Android手机能扫描到的蓝牙设备显示在ListView中,如果你能只需要连接一种设备的话并且知道设备的Mac 地址的话,你可以省略这一步操作,这里当学习使用
1 | import android.app.Activity; |
代码贴在上面了,具体的代码解释也写在里面了,其实我开始是不打算做这步操作的,因为需求时只需要连接一个蓝牙扫描枪。但后面觉得还是得扫描的,首先你不一定有设备的Mac地址,再来万一后面要添加需求的话就整个爆炸了。所以有时候不能把程序写的太死。至于如何查找蓝牙设备以及蓝牙设备的状态,上面的代码写的很详细了,再结合我之前推荐的第一篇文章就很好懂了。
蓝牙设备的连接以及数据I/O流的传输
其实在做这步操作的时候,我有点担心实现不了,因为对于Socket来说,你至少得写Socket和ServerSocket这两个类,具体的可以看看我之前对Socket的博客http://blog.csdn.net/cuihaoren01/article/details/45458265,但这里蓝牙扫描枪那边你是不可能编程的的,所以不存在ServerSocket的,好像网上大部分的蓝牙传输都是和Ardunio进行传输的,我也不晓得它可不可以进行编程所以就很担心这样写能不能实现。后面我在GitHub上找到一个蓝牙串口助手demo来试试,发现它可以进行数据传送,但由于它写的代码过于复杂也不是一个框架可以直接利用https://github.com/hzjerry/BluetoothSppPro,所以就没有深究。
没办法了,实践是检验真理的唯一标准,那就只能开始自己测试了,接下来第二篇文章就发挥了作用,可能我不需要实现ServerSocket服务端的编程,在使用蓝牙串口助手测试的时候,你配对上加连接上就可以直接用了,说明我只需要和它(蓝牙枪)能连接上就好了。连接的做法步骤如下:
- 首先你得获取到你需要连接的设备。(这里就需要你得设备的Mac地址)
- 你需要建立与服务端通信的Socket,看我之前的博客客户端都是通过IP和端口来获得的通信的socket,服务端是通过accept()的方式获取的,而这里这种方式被毙了(感觉也不能说毙了,估计是蓝牙枪那边有一个ServerSocket,去accept(),而客户端有其他的方法拿到通信的Socket。)
- socket.connect()
1 | btn.setOnClickListener(new View.OnClickListener() { |
这一部分就是连接蓝牙设备的操作,本来这些操作我是放到一个线程中去执行的,但是很不幸的是会报错,然后我就放到UI线程中去了,结果还过了,按道理耗时操作放到UI线程中不是会爆炸的嘛…暂时放一放这个问题。然后还有一个线程ReadThread
1 | Thread ReadThread = new Thread(){ |
这样就完成了蓝牙串口助手的部分功能,具体的实例见源码下载。
源码下载:
已知要连接设备的address,只需要修改MainActivity中address字符串的值就可以了。
http://download.csdn.net/detail/cuihaoren01/9496677
扫描蓝牙设备,选择需要连接的设备,进行传输。
http://download.csdn.net/detail/cuihaoren01/9496711