安卓平台提供对蓝牙通讯栈的支持,它允许设备和其他的蓝牙设备进行无线传输数据。 应用程序层通过安卓蓝牙API来调用蓝牙相关功能。这些API使程序无线连接蓝牙设备,并拥有P2P或多端无线连接的特性。
本文介绍了怎样使用蓝牙API完成建立蓝牙连接的必要四步:
所有蓝牙API都在android.bluetooth
包下,下面有一些类和接口的摘要,你可能需要它们来建立蓝牙连接:
代表本地蓝牙适配器(蓝牙无线电)。BluetoothAdapter
是所有蓝牙交互的入口。使用这个你可以发现其他蓝牙设备,查询已配对的设备列表,使用一个已知的MAC地址来实例化一个BluetoothDevice
,以及创建一个BluetoothServerSocket
来为监听与其他设备的通信。
代表一个远程蓝牙设备,使用这个来请求一个与远程设备的BluetoothSocket
连接,或者查询关于设备名称、地址、类和连接状态等设备信息。
代表一个蓝牙socket的接口(和TCP Socket类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过InputStream和OutputStream交换数据。
代表一个开放的服务器socket
,它监听接受的请求(与TCP ServerSocket
类似)。为了连接两台Android设备,一个设备必须使用这个类开启一个服务器socket
。当一个远程蓝牙设备开始一个和该设备的连接请求,BluetoothServerSocket
将会返回一个已连接的BluetoothSocket
,接受该连接。
描述一个蓝牙设备的基本特性和性能。这是一个只读的属性集合,它定义了设备的主要和次要的设备类以及它的服务。但是,它没有描述所有的蓝牙配置和设备支持的服务,它只是暗示了设备的类型。
一个表示蓝牙配置文件的接口。一个Bluetooth profile
是一个基于蓝牙的通信无线接口定义。一个例子是Hands-Free profile
。更多的讨论请见Working with Profiles
。
提供对移动手机使用的蓝牙耳机的支持。它包含了Headset and Hands-Free (v1.5)
配置文件。
定义高品质的音频如何通过蓝牙连接从一个设备传输到另一个设备。”A2DP“
是Advanced Audio Distribution Profile
的缩写。
表示一个Health Device Profile
代理,它控制蓝牙服务。
一个抽象类,你可以使用它来实现BluetoothHealth
的回调函数。你必须扩展这个类并实现回调函数方法来接收应用程序的注册状态改变以及蓝牙串口状态的更新。
表示一个应用程序配置,Bluetooth Health
第三方应用程序注册和一个远程Bluetooth Health
设备通信。
一个接口,当BluetoothProfile
IPC客户端从服务器上建立连接或断开连接时,它负责通知它们(也就是,运行在特性配置的内部服务)。
BLUETOOTH
和BLUETOOTH_ADMIN
。BLUETOOTH
权限。为了初始化设备查找或控制蓝牙设置,你必须请求BLUETOOTH_ADMIN
权限。大多数应用需要这个权限,仅仅是为了可以发现本地蓝牙设备。这个权限授权的其他功能不应该被使用,除非该应用是一个“强大的控制器”,来通过用户请求修改蓝牙设置。注意:如果你使用BLUETOOTH_ADMIN
权限,那么必须拥有BLUETOOTH
权限。
在你的应用程序清单文件中声明蓝牙权限。例如:
<manifest ... >
<uses-permission android:name="android.permission.BLUETOOTH" />
...
</manifest>
在你的应用可以通过蓝牙进行通信之前,你需要验证该设备是否支持蓝牙,如果支持,确保它被打开了。
如果不支持蓝牙,那么你应该优雅地关掉所有蓝牙特性,如果支持蓝牙,但是没有开启,那么你可以请求用户在不离开你的应用前提下开启蓝牙。这个过程使用BluetoothAdapter
用两步完成。
有的蓝牙活动都需要请求BluetoothAdapter
。为了得到BluetoothAdapter
,调用静态的getDefaultAdapter()
方法。它返回一个BluetoothAdapter
,代表设备本身的蓝牙适配器(蓝牙无线电)。一个完整的系统只有一个蓝牙适配器,而且你的应用可以使用BluetoothAdapter
与它进行交互。如果BluetoothAdapter
返回为null,那么设备不支持蓝牙而你的故事将在此结束。例如:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
}
接下来,你需要保证蓝牙是开启的。调用isEnabled()
来检查蓝牙最近是否是开启的。如果这个方法返回false,那么蓝牙没有开启。为了请求开启蓝牙,调用startActivityForResult()
并使用ACTION_REQUEST_ENABLE
方法Intent
。这将发出一个请求来利用系统设置开启蓝牙(不需要停止你的应用)。例如:
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
一个对话框将会出现,请求用户开启蓝牙,像在图1中展示的那样。如果用户相应”是“,系统将会开启蓝牙,而且一旦完成进程(或失败)就返回你的应用。
传给startActivityForResult()
的REQUEST_ENABLE_BT
常量是一个本地定义的整型(必须大于0),系统在你的onActivityResult()
实现中返回给你作为requestCode
参数。
如果开启蓝牙成功,你的activity
在onActivityResult()
回调函数中接受一个RESULT_OK
结果代码。如果蓝牙因为一个错误(或者用户相应”否“)没有开启,那么结果代码就是RESULT_CANCELED
。
可选的,你的应用也可以监听ACTION_STATE_CHANGED
广播Intent
,任何时候蓝牙状态改变了系统将会广播该Intent。这个广播包含了额外的变量EXTRA_STATE
和EXTRA_PREVIOUS_STATE
,分别包含了新的和老的蓝牙状态。这些额外的变量可能值是STATE_TURNING_ON,STATE_ON
,STATE_TURNING_OFF
和STATE_OFF
。监听这个广播对于检测你的应用运行时蓝牙状态的变化是非常有用的。
提示:开启可发现性将会自动开启蓝牙。如果你打算在执行蓝牙activity之前长期开启设备的可发现性,你可以跳过上面的第二步。阅读下面的enabling discoverability
。