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

查找设备

使用BluetoothAdapter对象,能够通过设备发现或查询已配对的设备列表来找到远程的蓝牙设备。

设备发现是一个扫描过程,该过程搜索本地区域内可用的蓝牙设备,然后请求一些彼此相关的一些信息(这个过程被叫做“发现”、“查询”或“扫描”)。但是,本地区域内的蓝牙设备只有在它们也启用了可发现功能时,才会响应发现请求。如果一个设备是可发现的,那么它会通过共享某些信息(如设备名称、类别和唯一的MAC地址)来响应发现请求。使用这些信息,执行发现处理的设备能够有选择的初始化跟被发现设备的连接。

一旦跟远程的设备建立的首次连接,配对请求就会自动的被展现给用户。当设备完成配对,相关设备的基本信息(如设备名称、类别和MAC地址)就会被保存,并能够使用蓝牙API来读取。使用已知的远程设备的MAC地址,在任何时候都能够初始化一个连接,而不需要执行发现处理(假设设备在可连接的范围内)。

要记住配对和连接之间的差异。配对意味着两个设备对彼此存在性的感知,它们之间有一个共享的用于验证的连接密钥,用这个密钥两个设备之间建立被加密的连接。连接意味着当前设备间共享一个RFCOMM通道,并且能够被用于设备间的数据传输。当前Android蓝牙API在RFCOMM连接被建立之前,要求设备之间配对。(在使用蓝牙API初始化加密连接时,配对是自动被执行的。)

以下章节介绍如何发现已配对的设备,或发现新的使用了可发现功能的设备。

注意:默认Android设备是不可发现的。用户能够通过系统设置在限定的时间内变成可发现的设备,或者应用程序能够请求用户启用可发现性,而不离开应用程序。如何启用可发现性,会在下文来讨论。

查询配对设备

在执行设备发现之前,应该先查询已配对的设备集合,来看期望的设备是否是已知的。调用getBondedDevices()方法来完成这件工作。这个方法会返回一个代表已配对设备的BluetoothDevice对象的集合。例如,你能够查询所有的配对设备,然后使用一个ArrayAdapter对象把每个已配对设备的名称显示给用户。

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if(pairedDevices.size()>0){
    // Loop through paired devices
    for(BluetoothDevice device : pairedDevices){
        // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName()+"\n"+ device.getAddress());
    }

}

从BluetoothDevice对象来初始化一个连接所需要的所有信息就是MAC地址。在这个例子中,MAC地址被作为ArrayAdapter的一部分来保存,并显示给用户。随后,该MAC地址能够被提取用于初始化连接。

发现设备

简单的调用startDiscovery()方法就可以开始发现设备。该过程是异步的,并且该方法会立即返回一个布尔值来指明发现处理是否被成功的启动。通常发现过程会查询扫描大约12秒,接下来获取扫描发现的每个设备的蓝牙名称。

为了接收每个被发现设备的的信息,你的应用程序必须注册一个ACTION_FOUND类型的广播接收器。对应每个蓝牙设备,系统都会广播ACTION_FOUND类型的Intent。这个Intent会携带EXTRA_DEVICE和EXTRA_CLASS附加字段,这个两个字段分别包含了BluetoothDevice和BluetoothClass对象。例如,下列演示了你如何注册和处理设备发现时的广播:

// Create a BroadcastReceiver for ACTION_FOUND

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        // When discovery finds a device

        if (BluetoothDevice.ACTION_FOUND.equals(action)) {

            // Get the BluetoothDevice object from the Intent

            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

            // Add the name and address to an array adapter to show in a ListView

            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());

        }

    }

};

// Register the BroadcastReceiver

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy

警告:执行设备发现,对于蓝牙适配器来说是一个沉重的过程,它会消耗大量的资源。一旦发现要连接设备,在尝试连接之前一定要确认用cancelDiscovery()方法来终止发现操作。另外,如果已经有一个跟设备的连接,那么执行发现会明显的减少连接的可用带宽,因此在有连接的时候不应该执行发现处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值