从Android 2.0版的SDK开始,公开了蓝牙相关的API接口,而之前的1.5~1.6未公开蓝牙API的系统,实际上也仅仅是未公开API而已,有可能是带有蓝牙服务的,通过一些Hack手段是能够获取到被隐藏的API的,这部分不在本文讨论范围之内。从SDK中公开的API来看,功能相当简单,并没有提供传输文件的直接支持,也就意味着要在Android上编码实现传送文件,还是要花一番功夫的。
蓝牙传输文件是通过OBEX协议来实现的,具体可以参见蓝牙相关的协议说明。对于传送文件而言,我们只需要实现OBEX中OBJECT PUSH的那一部分即可,好在在Android Bluetooth API的基础上实现OBEX的协议中的PUSH部分完全是可行的,下面就来详细说明一下。首先,BluetoothSocket和普通的用于网络编程的Socket有些不同,我们要实现的是一个传送文件的客户端,可以通过BluetoothDevice.
createRfcommSocketToServiceRecord (UUID uuid) 这一接口来创建BluetoothSocket,注意该接口需要传入一个UUID的参数,这一UUID将标示服务类型,可以参见SDP(Service Discover Protocol),用于传输文件的服务的UUID是{00001105-0000-1000-8000-00805F9B34FB},这样如果接收方能够支持这一服务的话,我们就可以成功创建出一个用于传输的Socket。