一般的Android手机都带有蓝牙,虽说BT这东西放到现在看速度是奇慢,但还是有很多的手持设备等,提供了蓝牙的支持,那么用我们的手机,就可以连接到这些设备,然后进行一些操作。


比如楼主这次要实现的是用手机连接到蓝牙设备,扫描RFID码。


先大体说下步骤吧:

1.打开手机和设备的BT。

2.手机和设备进行配对,扫描,输入密码进行配对。

3.手机和设备之间建立起Socket通信。

4.发/收消息,进行通信。

5.关掉Socket,GG。


步骤1~2,我是直接在设置里进行操作的,自己再写一套太麻烦了。这里我们主要来看3~5步:


首先,要从已配对的设备列表中,找到我们要连接的目标设备。

BluetoothAdapter是这样获取的:

mBTAdapter = BluetoothAdapter.getDefaultAdapter();

通过BTAdapter,就可以获取已经配对的设备列表,从中挑选出我需要的BTDevice:

/** * 找到目录设备(已配对) */private void connectToDevice() {mTargetDevice = null;Set devices = mBTAdapter.getBondedDevices();if (devices != null && devices.size() > 0) {Iterator iterator = devices.iterator();while (iterator.hasNext()) {// 有带关键字"6301"的,则取之BluetoothDevice dev = iterator.next();if (dev.getName().contains("6301")) {mTargetDevice = dev;break;}}if (mTargetDevice == null) {// 无则取第一个mTargetDevice = devices.iterator().next();}mConnectedDev.setText(String.format(getString(R.string.connected_device),mTargetDevice.getName()));// 开始扫描mScanThread = new ST(mTargetDevice);mScanThread.start();} else {mConnectedDev.setText(R.string.no_bond_device);}}

有了目标设备,我们就可以进行连接了,工作放在另一个线程里来做:

private class ST extends Thread {private ST(BluetoothDevice d) {mDevice = d;// 正在连接至设备mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0,getString(R.string.connecting_to_device)));}private BluetoothDevice mDevice;private BluetoothSocket mBTSocket;@Overridepublic void run() {try {Method m = mDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});mBTSocket = (BluetoothSocket) m.invoke(mDevice, 1);mBTSocket.connect();// 可以开如扫描mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0, getString(R.string.ok_to_scan)));// 连接okBufferedInputStream in = new BufferedInputStream(mBTSocket.getInputStream());int b1 = in.read();int b2 = in.read();if (b1 == 0xaa && b2 == 0x53) {// 帧头找到in.skip(2);// 跳过设备IDin.skip(2);// 跳过指令长度in.skip(1);// 跳过指令码int lenEPC = in.read(); // EPC长度System.out.println("EPC lenth: " + lenEPC);StringBuilder builderEPC = new StringBuilder();// 读取EPCSystem.out.println("read EPC E");for (int i = 0; i < lenEPC; i++) {builderEPC.append(Integer.toHexString(in.read()));}System.out.println("read EPC X");mRFIDString = builderEPC.toString().trim().toUpperCase();mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0, mRFIDString));} else {readFailed();}} catch (Exception e) {e.printStackTrace();readFailed();} finally {if (mBTSocket != null) {try {mBTSocket.close();} catch (IOException e) {e.printStackTrace();}}}}private void readFailed() {mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0,getString(R.string.scan_failed_plz_retry)));}public void closeSocket() {if (mBTSocket != null) {try {mBTSocket.close();mBTSocket = null;} catch (IOException e) {e.printStackTrace();}}}}


说明:

1. run()方法开头用反射调用"createRfcommSocket"方法的一段代码,是为了解决连接时频繁报出connection reset等问题的,引起这些问题的主要原因,还是由于传入的UUID不对。

2. BluetoothSocket和普通的Socket基本是一样的,用起来无门槛。



这个例子,是手机连接蓝牙设备使用到的一个通用例子,run()里的操作,是根据蓝牙设备的不同而不同的。

楼主现在在琢磨Android手机连接蓝牙打印机进行打印,有相关经验的朋友,望不吝赐教,解答以下问题:

1. 有没有一个“大一统”的蓝牙打印机API包?

2. 没有的话,是不是每针对一款打印机,就要写一套通代码?

3.有木有相关实例代码,求发给楼主一份,楼主也想站在巨巨们的肩膀上,求成全~。~

(求代码不能忘记留邮箱:ueryueryuery@163.com,谢谢)

更多相关文章

  1. Android:创建可穿戴应用 - 建立模拟器和创建项目
  2. Android设备获取扫码枪扫描的内容与可能遇到的问题解决
  3. Android传感器 设备坐标系到世界坐标系的转换 分析以及应用
  4. Android(安卓)Developers:传感器概述
  5. android Ble4.0蓝牙开发之搜索慢、startLeScan()过时,6.0以上不需
  6. Android传感器概述(二)
  7. 跟Google学习Android开发-起始篇-支持不同的设备(1)
  8. Android设备MTP方式连接PC增删文件无法实时更新的问题
  9. android版本兼容,高版本低版本兼容性-[Android_YangKe]

随机推荐

  1. android 下改变默认的checkbox的 选中 和
  2. 为Eclipse安装插件ADT plugin
  3. Space+onTouchEvent=Hitarea:像Flash那样
  4. 《Android开发从零开始》――25.数据存储
  5. Android UI(6)Building Apps with Multim
  6. Android UI开发第二十篇——仿launcher的
  7. android应用商店完整版源码
  8. android通讯录实例(二)
  9. Android内置多个launcher设置默认launche
  10. Android UndoBar介绍