Android-Bluetooth

来源:互联网 发布:手机视频编辑软件 编辑:程序博客网 时间:2024/06/09 13:41

           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 devicesif (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_FOUNDprivate 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 BroadcastReceiverIntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
所有一切都需要从 BluetoothDevice对象来初始化一个地址是MAC的连接。在这个示例中,它是保存ArrayAdapter的一部分显示给用户。为了启动连接,MAC地址稍后可以被提取。你可以了解更多关于创建一个连接部分 Connecting Devices。



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机没开定位丢了怎么办 我和我老婆每天都吵架怎么办 现在在学注册消防师好枯燥怎么办 店铺台阶太高顾客不愿进来怎么办? 上古卷轴5跑步要沉下去怎么办 1岁半宝宝半夜醒来不睡觉怎么办 上古卷轴5不小心偷了东西怎么办 47牙缺失17号长长了怎么办 碎纸机过热件亮了卡住纸了怎么办 汽车买贵了2万多怎么办 宝宝眼皮被蚊子咬肿了怎么办 一岁宝宝撞头咬到舌头有伤口怎么办 二胎快生了老大特别粘人怎么办 生二胎不舍得大宝跟奶奶睡怎么办 怀二胎婆婆不帮忙带孩子怎么办 注册过的高铁用户名忘了怎么办 硕士延期毕业找好的工作怎么办 竞彩足球绑定信用卡提不了现怎么办 qq启动出现问题请卸载重装怎么办 u盘有文件打开后却是空的怎么办 王者荣耀不记得所在的区服怎么办 交易猫出售游戏账号是微信号怎么办 网银密码输错3次怎么办 无线网卡信号很好就是没网速怎么办 红米2a忘了登陆账号怎么办 qq封了密保手机没用了怎么办 乐视手机重置账号密码忘了怎么办 此版本的ios不支持银联怎么办 单反m档拍出来照片是黑色怎么办 从兴趣部落老发骚扰信息怎么办 在厂里辞一个月厂长不批怎么办 在厂里做管理被员工恐吓怎么办 在葡京娱乐输了很多钱怎么办 从珠海入镜澳门北京往返签注怎么办 艾艾灸灸了一身小子子怎么办? 微信视频已过期或已清理怎么办 视频已过期或已被清理怎么办 小孩作业不会老婆天天吵骂打怎么办 苹果手机在太阳下屏幕变暗怎么办 斗鱼的鱼丸竞猜主播结算了怎么办 附近有个小姐姐想加她好友怎么办