Android应用开发笔记(11):Android上的蓝牙通信功能的开发:BluetoothChat例程分析

1.    概述

Bluetooth是几乎现在每部手机标准配备的功能,多用于耳机mic等设备与手机的连接,除此之外,还可以多部手机之间建立bluetooth通信,本文就通过SDK中带的一个聊天室的例程,来介绍一下Android上的Bluetooth的开发。

在Android1.x的时候,相关API非常不完善,还不能简单的使用Bluetooth开发,有一个开源项目可以帮助程序员使用、开发蓝牙,支持直接方法bluetooth协议栈。在Android2以后,框架提供了一些官方API来进行蓝牙的通信,但目前的程序也比较不完善。本文主要讨论Android2后的Bluetooth通信的API使用方法。

首先看聊天室的效果图:


2.    Bluetooth通信 API介绍

2.1. Bluetooth 通信过程


2.2. Bluetooth API的主要方法

BluetoothAdapter类

BluetoothAdapter.getDefaultAdapter():得到本地默认的BluetoothAdapter,若返回为null则表示本地不支持蓝牙;

isDiscovering():返回设备是否正在发现周围蓝牙设备;

cancelDiscovery():取消正在发现远程蓝牙设备的过程;

startDiscovery():开始发现过程;

getScanMode():得到本地蓝牙设备的Scan Mode;

getBondedDevices():得到已配对的设备;

isEnabled():蓝牙功能是否启用。

当发现蓝牙功能未启用时,如下调用设置启用蓝牙:

if (!mBluetoothAdapter.isEnabled()) {

            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

           startActivityForResult(enableIntent, REQUEST_ENABLE_BT);

        }

      

如果发现当前设备没有打开对外可见模式,则传递Intent来调用打开可发现模式,代码如下:

IntentdiscoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);           discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);

startActivity(discoverableIntent);

 

BluetoothDevice类,此为对应的远程蓝牙Device

       createRfcommSocketToServiceRecord():创建该Device的socket。

BluetoothSocket类

       connect():请求连接蓝牙。

getInputStream():得到输入流,用于接收远程方信息。

getOutputStream():得到输出流,发送给远程方的信息。

close():关闭蓝牙连接。

InputStream类:

       read(byte[]):以阻塞方式读取输入流。

OutputStream类:

       write(byte[]):将信息写入该输出流,发送给远程。

3.    BluetoothChat例程分析

Google提供的关于Bluetooth开发的例程为Bluetoothchat,使用截图可见本文一开始。除去配置及ui定义等文件,主程序文件共三个:BluetoothChat.java、BluetoothChatService.java以及DeviceListActivity.java,详细功能可见下面的描述。

3.1. 整体调用关系序列图


3.2. BluetoothChat.java

例程的主Activity。onCreate()得到本地BluetoothAdapter设备,检查是否支持。onStart()中检查是否启用蓝牙,并请求启用,然后执行setupChat()。setupChat()中先对界面中的控件进行初始化增加点击监听器等,然创建BluetoothChatService对象,该对象在整个应用过程中存在,并执行蓝牙连接建立、消息发送接受等实际的行为。

3.3. BluetoothChatService.java

public synchronized void start():

开启mAcceptThread线程,由于样例程序是仅2人的聊天过程,故之前先检测mConnectThread和mConnectedThread是否运行,运行则先退出这些线程。

public synchronized void connect(BluetoothDevicedevice) :

取消CONNECTING和CONNECTED状态下的相关线程,然后运行新的mConnectThread线程。

public synchronized voidconnected(BluetoothSocket socket, BluetoothDevice device):

开启一个ConnectedThread来管理对应的当前连接。之前先取消任意现存的mConnectThread、mConnectedThread、mAcceptThread线程,然后开启新mConnectedThread,传入当前刚刚接受的socket连接。最后通过Handler来通知UI连接OK。

public synchronized void stop():

停止所有相关线程,设当前状态为NONE。

public void write(byte[] out):

在STATE_CONNECTED状态下,调用mConnectedThread里的write方法,写入byte。

private void connectionFailed():

连接失败的时候处理,通知ui,并设为STATE_LISTEN状态。

private void connectionLost():

当连接失去的时候,设为STATE_LISTEN状态并通知ui。

内部类:

private class AcceptThread extends Thread:

创建监听线程,准备接受新连接。使用阻塞方式,调用BluetoothServerSocket.accept()。提供cancel方法关闭socket。

private class ConnectThread extends Thread:

这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过BluetoothDevice.createRfcommSocketToServiceRecord(),从待连接的device产生BluetoothSocket. 然后在run方法中connect,成功后调用BluetoothChatSevice的connected()方法。定义cancel()在关闭线程时能够关闭相关socket。

private class ConnectedThread extendsThread:

这个是双方蓝牙连接后一直运行的线程。构造函数中设置输入输出流。Run方法中使用阻塞模式的InputStream.read()循环读取输入流, 然后post到UI线程中更新聊天消息。也提供了write()将聊天消息写入输出流传输至对方,传输成功后回写入UI线程。最后cancel()关闭连接的socket。

3.4. DeviceListActivity.java

该类包含UI和操作的Activity类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。

 

除了RFCOMM通信外,Android上关于Bluetooth的还有SDP、GAP、耳机设备连接等内容,本文还未涉及,将会随着蓝牙相关API在新版本中的进一步完善来学习使用。

http://blog.youkuaiyun.com/xjanker2/article/details/6303927
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值