Android的联通性---Bluetooth(四)

来源:互联网 发布:智能网络电视哪个好 编辑:程序博客网 时间:2024/06/06 15:02

启用设备的可发现性

如果要让本地设备可以被其他设备发现,那么就要调用ACTION_REQUEST_DISCOVERABLE操作意图的startActivityForResult(Intent, int)方法。这个方法会向系统设置发出一个启用可发现模式的请求(不终止应用程序)。默认情况下,设备的可发现模式会持续120秒。通过给Intent对象添加EXTRA_DISCOVERABLE_DURATION附加字段,可以定义不同持续时间。应用程序能够设置的最大持续时间是3600秒,0意味着设备始终是可发现的。任何小于0或大于3600秒的值都会自动的被设为120秒。例如,以下代码把持续时间设置为300秒:

Intent discoverableIntent = new

Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);

startActivity(discoverableIntent);

如图2所示,申请用户启用设备的可发现模式时,会显示这样一个对话框。如果响应“Yes”,那么设备的可发现模式会持续指定的时间,而且你的Activity会接收带有结果代码等于可发现设备持续时间的onActivityResult()回调方法的调用。如果用户响应“No”或有错误发生,则结果代码等于RESULT_CANCELED.

图2.启用可发现性对话框。

注意:如果设备没有开启蓝牙功能,那么开启设备的可发现模式会自动开启蓝牙。

在可发现模式下,设备会静静的把这种模式保持到指定的时长。如果你想要在可发现模式被改变时获得通知,那么你可以注册一个ACTION_SCAN_MODE_CHANGED类型的Intent广播。这个Intent对象中包含了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE附加字段,它们会分别告诉你新旧扫描模式。它们每个可能的值是:SCAN_MODE_CONNECTABLE_DISCOVERABLE,SCAN_MODE_CONNECTABLE或SCAN_MODE_NONE,它们分别指明设备是在可发现模式下,还是在可发现模式下但依然可接收连接,或者是在可发现模式下并不能接收连接。

如果你要初始化跟远程设备的连接,你不需要启用设备的可现性。只有在你想要把你的应用程序作为服务端来接收输入连接时,才需要启用可发现性,因为远程设备在跟你的设备连接之前必须能够发现它。

连接设备

为了让两个设备上的两个应用程序之间建立连接,你必须同时实现服务端和客户端机制,因为一个设备必须打开服务端口,同时另一个设备必须初始化跟服务端设备的连接(使用服务端的MAC地址来初始化一个连接)。当服务端和客户端在相同的RFCOMM通道上有一个BluetoothSocket连接时,才能够被认为是服务端和客户端之间建立了连接。这时,每个设备能够获得输入和输出流,并且能够彼此开始传输数据。

服务端设备和客户端设备彼此获取所需的BluetoothSocket的方法是不同的。服务端会在接收输入连接的时候接收到一个BluetoothSocket对象。客户端会在打开跟服务端的RFCOMM通道时接收到一个BluetoothSocket对象。

一种实现技术是自动的准备一个设备作为服务端,以便在每个设备都会有一个服务套接字被打开,并监听连接请求。当另一个设备初始化一个跟服务端套接字的连接时,它就会变成一个客户端。另一种方法,一个设备是明确的”host”连接,并且根据要求打开一个服务套接字,而其他的设备只是简单的初始化连接。

注意:如果两个设备之前没有配对,那么Android框架会在连接过程期间,自动的显示一个配对请求通知或对话框给用户,如图3所示。因此在试图连接设备时,你的应用程序不需要关心设备是否被配对。FRCOMM的尝试性连接会一直阻塞,一直到用户成功的配对,或者是因用户拒绝配对或配对超时而失败。

图3.蓝牙配对对话框

原创粉丝点击