Android-Bluetooth

本文详细介绍了Android蓝牙API的功能,包括如何使用这些API进行设备发现、连接设备和数据传输等核心任务。同时,还介绍了Android蓝牙API提供的关键类和接口。

           Android平台包括支持蓝牙网络堆栈,它允许一个设备通过无线网络与其他蓝牙设备交换数据。应用程序框架通过Android蓝牙api提供了访问蓝牙功能。这些api允许应用程序通过无线连接到其他蓝牙设备,使点对点和多点无线功能。

用蓝牙api,android应用程序可以执行以下:

●  扫描其他蓝牙设备

●  查询当地的蓝牙适配器,蓝牙设备配对

●  建立RFCOMM渠道

●  通过服务发现连接到其他设备

●  传输数据和其他设备

●  管理多个连接

最基本的:

       本文档描述了如何使用Android蓝牙api来完成四个主要任务必要沟通使用蓝牙:设置蓝牙,搜索设备,要么是成对或可在当地区域,连接设备和设备之间传输数据。

       所以的蓝牙设备都可在android.bluetooth包中。这里是类和接口的一个摘要,你将需要创建蓝牙连接:

BluetoothAdapter

        代表当地的蓝牙适配器(蓝牙无线电)。BluetoothAdapter是为所有蓝牙交互的入口点。使用它,您会发现其他蓝牙设备,查询列表的保税(配对)设备,使用一个已知的MAC地址实例化一个BluetoothDevice,并从其他设备上创建一个BluetoothServerSocket监听通信

BluetoothDevice

       代表一个远程蓝牙设备。使用这个来请求通过一个BluetoothSocket或查询相关设备的信息如姓名、地址、阶级和粘结状态与远程设备连接

BluetoothSocket

       代表了一个蓝牙套接字接口(类似于一个TCP Socket)。这是连接点,允许一个应用程序通过InputStream和OutputStream与另一个蓝牙设备交换数据。

BluetoothServerSocket

       代表了一个开放的服务器套接字,侦听传入请求(类似于一个TCP ServerSocket)。为了连接两个Android设备,设备必须打开一个服务器套接字与这个类。当一个远程蓝牙设备发送一个连接请求到这个设备,当连接被接受时BluetoothServerSocket将返回一个连接BluetoothSocket。

BluetoothClass

      描述蓝牙设备的一般特征和功能。这是一个只读属性集,定义了设备的主要和次要设备类和它的服务。然而,这并不能可靠地描述所有蓝牙配置文件和服务支持的设备,但是作为一个提示的设备类型它是有用的。

BluetoothProfile

       一个接口,代表一个蓝牙配置文件。蓝牙配置文件对基于蓝牙设备之间的通信是一个无线接口规范。一个例子是免提装置配置文件。进一步讨论了配置文件,查看正在处理的配置文件

BluetoothHeadset

      提供支持蓝牙耳机与手机使用。这包括蓝牙耳机和免提(v1.5)配置文件。

BluetoothA2dp

      定义了如何让高质量的音频可以流从一个设备到另一个蓝牙连接。“A2DP“代表先进的音频分布配置属性。

BluetoothHealth

      代表一个安全设备概要文件代理控制蓝牙服务。

BluetoothHealthCallback

      你可以用一个抽象类来实现BluetoothHealth回调。你必须扩展这个类并实现回调方法来接收更新改变应用程序的注册状态和蓝牙信道状态。

BluetoothHealthAppConfiguration

    表示一个应用程序配置,蓝牙安全第三方应用寄存器与远程蓝牙安全设备之间的通信。

BluetoothProfile.ServiceListener

    当他们被连接或断开服务时(即内部服务,运行一个特定的配置文件),会有一个接口通知BluetoothProfile IPC客户端。

蓝牙权限:

        为了在您的应用程序上使用蓝牙功能,你需要声明至少一两个蓝牙权限: BLUETOOTH 和 BLUETOOTH_ADMIN。

        为了执行任何蓝牙通信,你必须请求许可的蓝牙,如请求一个连接,接受一个连接,传输数据。你必须请求蓝牙管理权限,以便启动或操作设备发现蓝牙设置。大多数应用程序需要这个权限仅仅是为了能够发现本地蓝牙设备。通过其他能力获得的权限则不应该使用,除非应用程序是一个“电源管理器”,将修改蓝牙设置在用户请求。注意:如果你使用蓝牙管理权限(BLUETOOTH_ADMIN permission),然后还必须有蓝牙许可 (BLUETOOTH permission)

在你的application.manifest.xml中声明蓝牙权限。 例如:

<manifest ... >
  <uses-permission android:name="android.permission.BLUETOOTH" />
  ...
</manifest>

 <uses-permission>参考更多关于申请权限的信息。

设置蓝牙

       在你的应用程序可以通过蓝牙通信之前,你需要验证蓝牙设备上的支持,如果有,确保它是启用的。

       如果蓝牙不受支持,那么你应该禁用任何蓝牙功能。如果蓝牙是支持的,但禁用,然后您可以要求用户启用蓝牙不离开您的应用程序。这个设置是分两步走,使用BluetoothAdapter。

1. 得到BluetoothAdapter

        BluetoothAdapter需要的任何和所有蓝牙活动。让BluetoothAdapter,调用静态getDefaultAdapter()方法。这返回一个BluetoothAdapter代表设备的蓝牙适配器(蓝牙无线电)。有一个蓝牙适配器为整个系统,您的应用程序可以与它交互,使用这个对象。如果getDefaultAdapter()返回null,那么该设备不支持蓝牙和你的事情将在这里结束。例如:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
    // Device does not support Bluetooth
}

2.启动蓝牙

        接下来,您需要确保蓝牙是启用的。称做 isEnabled()检查蓝牙是否启用。如果这个方法返回false,那么蓝牙是禁用的。请求蓝牙被启用,称做startActivityForResult()的ACTION_REQUEST_ENABL活动行为意图。这将发出一个请求来启用蓝牙通过系统设置(没有停止你的应用程序)。例如:

if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

         将会出现一个对话框,要求用户权限激活蓝牙,如图1。如果用户回答“yes”,一旦流程完成系统将开始启用蓝牙和焦点将返回到您的应用程序(或失败)。
 图1

      REQUEST_ENABLE_BT常量传递给startActivityForResult()是一个本地定义(自定义)的整数(必须大于0),系统通过回到你在onActivityResult()实现的requestCode参数。

         如果启用蓝牙成功,你的活动收到RESULT_OK 结果代码onActivityResult()回调。如果没有启用蓝牙由于一个错误(或用户回答“不”),那么结果代码是RESULT_CANCELED.

       你的应用程序也可以随时监听ACTION_STATE_CHANGED广播意图,每当蓝牙状态已经改变了系统都会广播。这个广播包含额外的字段EXTRA_STATE  EXTRA_PREVIOUS_STATE,分别包含新的和旧的蓝牙状态。这些额外领域的可能的值是STATE_TURNING_ONSTATE_ONSTATE_TURNING_OFF, 和STATE_OFF。当你的应用程序运行时,听这个广播有助于发现蓝牙状态的变化。

发现设备

         使用BluetoothAdapter,通过设备发现或通过查询列表(bonded)设备的配对,你可以找到远程蓝牙设备。

         设备发现是一个扫描程序,搜索当地区域为蓝牙激活设备,然后对每一个蓝牙请求一些信息(这是有时被称为“发现”、“查询”或“扫描”)。然而,一个蓝牙设备在本地将响应发现请求仅当它被发现时为启用(激活)状态。如果一个设备可以被发现,它将回应请求发现通过分享一些信息,如设备名称、类和其独特的MAC地址。使用这些信息,执行设备发现可以选择启动一个连接到发现设备。

        一旦与远程设备第一次连接,则一对请求将自动呈现给用户。当一个设备是成对的,该设备的基本信息(如设备名称、类和MAC地址)保存,可以使用蓝牙api阅读。为一个远程设备利用已知设备的MAC地址连接可以开始与它在任何时候执行发现(假设范围内的设备)。

记得配对与连接之间是有区别的。配对意味着两个设备都意识到彼此的存在,有一个共享的链接键,可用于认证,并有能力为彼此建立一个加密的连接。连接意味着设备设备之间目前共享一个信道,RFCOMM能够互相传输数据。目前Android  Bluetooth API的需要设备的蓝牙配对在RFCOMM建立连接之前。(配对是自动执行的,当你启动一个与蓝牙api加密的连接)。

查询配对设备

在执行设备发现之前,如果所需设备是已知的,那么它值得查询设备集合。为此 称为getBondedDevices()。这将返回一组BluetoothDevices代表已配对设备。例如,您可以查询所有已配对设备,然后使用一个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());
    }
}


发现设备

        开始发现设备,只需调用startDiscovery()。这个过程是异步的,该方法将返回一个布尔指示是否已成功启动发现。这个发现过程通常包括大约12秒的查询扫描,之后页面浏览每个发现设备检索它的蓝牙名称。

        为了获取每个设备发现的信息,你的应用程序必须为ACTION_FOUND意图注册一个BroadcastReceiver。对每一个设备,该系统将广播ACTION_FOUND意图。此意图携带额外的字段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
所有一切都需要从 BluetoothDevice对象来初始化一个地址是MAC的连接。在这个示例中,它是保存ArrayAdapter的一部分显示给用户。为了启动连接,MAC地址稍后可以被提取。你可以了解更多关于创建一个连接部分 Connecting Devices



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值