Android蓝牙开发经典笔记,程序和说明
- 格式:docx
- 大小:40.77 KB
- 文档页数:12
W hatever is worth doing is worth doing well.Never put off the work till tomorrow what you can put off today.A ndroid开发之蓝牙(Bluetooth)操作(一)--扫描已经配对的蓝牙设备分类: android 2012-08-14 16:41 1224人阅读 评论(10) 收藏举报androidbuttonnull通讯apiimport一. 什么是蓝牙(Bluetooth)?1.1 BuleTooth是目前使用最广泛的无线通信协议1.2 主要针对短距离设备通讯(10m)1.3 常用于连接耳机,鼠标和移动通讯设备等.二. 与蓝牙相关的API2.1 BluetoothAdapter:代表了本地的蓝牙适配器2.2 BluetoothDevice代表了一个远程的Bluetooth设备三. 扫描已经配对的蓝牙设备(1)注:必须部署在真实手机上,模拟器无法实现首先需要在AndroidManifest.xml 声明蓝牙权限<user-permission android:name="android.permission.BLUETOOTH" />配对蓝牙需要手动操作:1. 打开设置--> 无线网络 --> 蓝牙 勾选开启2. 打开蓝牙设置 扫描周围已经开启的蓝牙设备(可以与自己的笔记本电脑进行配对),点击进行配对电脑上会弹出提示窗口: 添加设备显示计算与设备之间的配对码,要求确认是否配对手机上也会显示类似的提示.四. 扫描已经配对的蓝牙设备(2)4.1 获得BluetoothAdapter对象4.2 判断当前移动设备中是否拥有蓝牙4.3 判断当前移动设备中蓝牙是否已经打开4.4 得到所有已经配对的蓝牙设备对象实现代码如下:MainActivity:import java.util.Iterator;import java.util.Set;import android.app.Activity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private Button button = null;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);button = (Button)findViewById(R.id.buttonId);button.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {//获得BluetoothAdapter对象,该API是android 2.0开始支持的BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();//adapter不等于null,说明本机有蓝牙设备if(adapter != null){System.out.println("本机有蓝牙设备!");//如果蓝牙设备未开启if(!adapter.isEnabled()){Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);//请求开启蓝牙设备startActivity(intent);}//获得已配对的远程蓝牙设备的集合Set<BluetoothDevice> devices = adapter.getBondedDevices();if(devices.size()>0){for(Iterator<BluetoothDevice> it = devices.iterator();it.hasNext();){BluetoothDevice device = (BluetoothDevice)it.next();//打印出远程蓝牙设备的物理地址System.out.println(device.getAddress());}}else{System.out.println("还没有已配对的远程蓝牙设备!");}}else{System.out.println("本机没有蓝牙设备!");}}});}}。
AndroidStudio蓝⽛开发实例——基于Android6.0因项⽬需要做⼀个Android 的蓝⽛app来通过⼿机蓝⽛传输数据以及控制飞⾏器,在此,我对这段时间⾥写的蓝⽛app的代码进⾏知识梳理和出现错误的总结。
该应⽤的Compile Sdk Version 和targetSdkVersion均为26,Min Sdk Version为22,基于Android studio平台开发。
⼀、声明蓝⽛权限⾸先,要在新建项⽬中的AndroidManifest.xml中声明两个权限:BLUETOOTH权限和BLUETOOTH_ADMIN权限。
其中,BLUETOOTH权限⽤于请求连接和传送数据;BLUETOOTH_ADMIN权限⽤于启动设备、发现或进⾏蓝⽛设置,如果要拥有该权限,必须现拥有BLUETOOTH权限。
其次,因为android 6.0之后采⽤新的权限机制来保护⽤户的隐私,如果我们设置的targetSdkVersion⼤于或等于23,则需要另外添加ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION权限,否则,可能会出现搜索不到蓝⽛设备的问题。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>⼆、启动和关闭蓝⽛1.⾸先,要获取BluetoothAdapter蓝⽛适配器的对象,然后检测设备是否⽀持蓝⽛。
关于android系统和android系统中蓝牙模块的概况1、android操作系统组件结构图:2、android蓝牙系统层次结构图Bluetooth JNI:是指java本地接口层。
是用于连接java部分和C/C++部分的纽带。
JNI调用层次是java—>JNI—>C/C++(SO库),BlueZ库(android4.4后被取代):Bulez是Linux官方蓝牙协议栈,从Linux2.4.6开始便成为Linux内核的一部分。
Bulez支持蓝牙核心层和协议。
参考/uid-20669742-id-224073.html3、蓝牙硬件接口Noke(智能解锁)宣传视频:/v_102_616/MTczOTgxMTQ.html4、bluedroid(取代bluez)/xubin341719/article/details/403782055、bluedroid整体协议栈架构图6、查看源代码(在线观看,下载源代码很麻烦)/7、与蓝牙相关的代码区:Application frameworkframework/base/core/java/android/bluetooth这里是app代码,使用android.bluetooth APIs和蓝牙设备交互其实现原理是通过Binder IPC机制使用蓝牙服务Bluetooth system service位于packages/app/Bluetooth,打包为一个Android应用程序(通过JNI与蓝牙协议栈交互)它在Android框架层实现了蓝牙的服务和ProfilesJNI有关代码位于packages/apps/Bluetooth/jni下当进行蓝牙操作时,JNI的代码会调用到HAL层以获取回调HAL (Hardware Abstraction Layer,硬件抽象层)HAL层定义了android.bluetooth和Bluetooth process calls into的标准接口其头文件位于hardware/libhardware/include/hardwarebluetooth.h: Contains the HAL for the Bluetooth hardware on the device bt_av.h: Contains the HAL for the advanced audio profile.bt_hf.h: Contains the HAL for the handsfree profile.bt_hh.h: Contains the HAL for the HID host profilebt_hl.h: Contains the HAL for the health profilebt_pan.h: Contains the HAL for the pan profilebt_sock.h: Contains the HAL for the socket profileBluetooth stack蓝牙协议栈,位于external/bluetooth/bluedroid实现了通用的蓝牙HAL及可配置组件Vendor extensions厂商可通过创建libbt-vendor模块来自定义扩展接口和HCI层来方便调试--------------------------------分割线-------------------------------------------- 蓝牙漏洞分析1、蓝牙的四种安全模式:见《蓝牙安全研究_严霄凤》2、蓝牙漏洞分析方法:见《智能手机蓝牙漏洞挖掘与分析_古益杰》基于Fuzzing的蓝牙OBEX漏洞挖掘技术:/link?url=1QsY_egb0vZJiZLQbHP2Jv_dNfGV1gUZrJyiIKoQyK2OQ7lxXfvGJwNjsIDABGRSLG_cFY9k7_G1M6bfA7Yg6LngdIG3Lw11pmOMDcOUBVq(比较早的一个研究)Bluetooth SIG蓝牙协议设备配对过程漏洞/art/200508/4913.htm。
达内总达内总部部i t 培训提供培训提供::jav java a 培训培训,3,3,3g g 培训培训,ph ,ph ,php p 培训培训,,软件测试培训软件测试培训,c++,c++,c++培训培训培训,.ne ,.ne ,.net t 培训培训,,达内android 开发笔记(11):Android 上的蓝牙通信功能的开发:BluetoothChat 例程分析1.概述Bluetooth 是几乎现在每部手机标准配备的功能,多用于耳机mic 等设备与手机的连接,除此之外,还可以多部手机之间建立bluetooth 通信,本文就通过SDK 中带的一个聊天室的例程,来介绍一下Android 上的Bluetooth 的开发。
在Android1.x 的时候,相关API 非常不完善,还不能简单的使用Bluetooth 开发,有一个开源项目可以帮助程序员使用、开发蓝牙,支持直接方法bluetooth 协议栈。
在Android2以后,框架提供了一些官方API 来进行蓝牙的通信,但目前的程序也比较不完善。
本文主要讨论Android2后的Bluetooth 通信的API 使用方法。
首先看聊天室的效果图:2.Bluetooth 通信API 介绍2.1.Bluetooth 通信过程达内总达内总部部i t 培训提供培训提供::jav java a 培训培训,3,3,3g g 培训培训,ph ,ph ,php p 培训培训,,软件测试培训软件测试培训,c++,c++,c++培训培训培训,.ne ,.ne ,.net t 培训培训,,2.2.Bluetooth API 的主要方法BluetoothAdapter 类BluetoothAdapter.getDefaultAdapter():得到本地默认的BluetoothAdapter ,若返回为null 则表示本地不支持蓝牙;isDiscovering():返回设备是否正在发现周围蓝牙设备;达内总达内总部部i t 培训提供培训提供::jav java a 培训培训,3,3,3g g 培训培训,ph ,ph ,php p 培训培训,,软件测试培训软件测试培训,c++,c++,c++培训培训培训,.ne ,.ne ,.net t 培训培训,,cancelDiscovery():取消正在发现远程蓝牙设备的过程;startDiscovery():开始发现过程;getScanMode():得到本地蓝牙设备的Scan Mode ;getBondedDevices():得到已配对的设备;isEnabled():蓝牙功能是否启用。
Android 开发之蓝牙2014/03/19 0 一.修改本机蓝牙设备的可见性二.扫描周围可用的蓝牙设备一. 清单文件AdroidManifest.xml:uses-permission android:name=“android.permission.BLUETOOTH”/!-若需要管理蓝牙设备,如修改可见性,则需以下的权限- uses-permission android:name=“android.permission.BLUETOOTH_ADMIN”/二.布局文件:main.xml:?xml version=“1.0”encoding=“utf-8”?LinearLayout xmlns:android=“schemas.android/apk/res/android”android:orientation=“vertical”android:layout_width=“fill_parent”android:layout_height=“fill_parent”TextView android:layout_width=“fill_parent”android:layout_height=“wrap_content”android:text=“@string/hello”/ Button android:id=“@+id/discoverButton”android:layout_width=“fill_parent”android:layout_height=“wrap_content”android:text=“设置可见性”/Button android:id=“@+id/scanButton”android:layout_wi dth=“fill_parent”android:layout_height=“wrap_content”android:text=“开始扫描”//LinearLayout三. MainActivity:import android.app.Activity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity { private Button discoverButton = null; private Button scanButton = null; private BluetoothAdapter adapter = null; private BluetoothReceiver bluetoothReceiver = null; /** Called when the activity is first created. */ @Override public。
蓝牙是啥我就不再说了,因为我肯定解释不清楚蓝牙是啥,有兴趣请移步至百度百科。
在开始前我们需要准备好一部手机而不是模拟器,且手机已经打开调试模式并连接到电脑上。
文中的本地设备均指我们自己的手机,而远程设备则是指其他的设备(电脑、其他手机或者其他)。
通常情况下,我们对蓝牙的操作主要有:开启和关闭蓝牙、搜索周边设备、能被周边设备所发现、获取配对设备、蓝牙设备间的数据传输。
1、打开蓝牙(当然首先要确保你的手机是有蓝牙设备的)蓝牙设备主要分为两部分,一部分为本地设备,另一部分为远程设备。
∙BluetoothAdapter——本地设备,对蓝牙操作首先就需要有一个BluetoothAdapter实例。
常用的几个方法如下:o cancelDiscovery()——取消本地蓝牙设备的搜索操作,如果本地设备正在进行搜索,那么调用该方法后将停止搜索操作。
o Disable()——关闭蓝牙设备。
o Enable()——打开蓝牙设备。
相信大家都有过打开蓝牙的经历,一般情况下都会弹出一个窗口,说正在请求打开蓝牙设备,你是不是允许云云。
o getAddress()——获取蓝牙设备的MAC地址。
o GetDefaultAdapter()——获取本地的蓝牙设备o getName()——获取本地蓝牙的名称o getRemoteDevice(String address)——根据远程设备的MAC地址来获取远程设备o startDiscovery()——蓝牙设备开始搜索周边设备∙BuletoothDevice——远程设备。
它所包含的方法和BluetoothAdapter一样,不再累述。
View Code1// 获取本地的蓝牙适配器实例2 BluetoothAdapter adapter =BluetoothAdapter.getDefaultAdapter();3if(adapter!=null)4 {5if(!adapter.isEnabled())6 {7//通过这个方法来请求打开我们的蓝牙设备8 Intent intent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);9 startActivity(intent);10 }11 }12else13 {14 System.out.println("本地设备驱动异常!");15 }2、搜索周边设备对于Android查找发现蓝牙设备使用BluetoothAdapter类的startDiscovery()方法就可以执行一个异步方式获取周边的蓝牙设备,因为是一个异步的方法所以我们不需要考虑线程被阻塞问题,整个过程大约需要12秒时间,这时我们可以注册一个BroadcastReceiver 对象来接收查找到的蓝牙设备信息,我们通过Filter来过滤ACTION_FOUND这个Intent动作以获取每个远程设备的详细信息,通过Intent字段EXTRA_DEVICE 和EXTRA_CLASS可以获得包含了每个BluetoothDevice 对象和对象的该设备类型BluetoothClass。
低功耗蓝牙BLE - 学习笔记蓝牙的分类BLE【实操恋爱课-程】协议框架关键术语及概念广播数【扣】据格式广播网【1】络拓扑GAT【О】T 连接的网络拓扑GATT【⒈】通讯事务服务和特【б】征Ser【9】vice?Char【5】acteristic?最近由【2】于项目需求在学习 BLE,网上Android BLE开发的资料相比其他【6】 Android 资料显得有些匮乏,在此记录学习例程,希望能能对学习 BLE 的童鞋有所帮助。
在上手 Android 之前我们需要先搞清楚蓝牙的协议及通讯过程,才不会在调用 Google 提供的 API 时似懂非懂。
蓝牙的分类当前的蓝牙协议分为基础率 - 增强数据率(BR-EDR)和低耗能(BLE)两种类型。
当然现在 BLE蓝牙模块?还有单模和双模之分,单模指的是仅支持BLE ,双模即 Bluetooth Classic + BLE。
蓝牙BD-EDR和蓝牙BLE主要区别BLE协议框架蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议(Bluetooth Core)和蓝牙使用层协议(Bluetooth Application)。
蓝牙核心协议关心对蓝牙核心技术的描述和规范,它只提供基础的机制,并不关心如何运用这些机制;蓝牙使用层协议,是在蓝牙核心协议的基础上,根据具体的使用需要定义出各种各样的策略,如 FTP、文件传输、局域网.?蓝牙核心协议(Bluetooth Core)又包含 BLE Controller 和 BLE Host 两部分。
这两部分在不一样的蓝牙技术中(BR-EDR、AMP、BLE),承担角色略有不一样,但大致的功能是相同的。
Controller 负责定义 RF、Baseband?等偏硬件的规范,并在这之上抽象出用于通信的逻辑链路(Logical Link);Host?负责在逻辑链路的基础上,进行更为友好的封装,这样就可以屏蔽掉蓝牙技术的细节,让 Bluetooth Application 更为方便的运用。
1、获取默认蓝牙设备private BluetoothAdapter mBluetoothAdapter;mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();2、打开搜索mBluetoothAdapter.startDiscovery();获取绑定设备Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();3、搜索到、结束搜索广播触发事件IntentFilter filter;fileter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(receiver, filter);filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(receiver, filter);private BroadcastReceiver receiver = new BroadcastReceiver(){public void onReceive(Context arg0, Intent intent) {action=intent.getAction()//如果搜索到,增加设备if(action.equals(BluetoothDevice.ACTION_FOUND)){BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);}if(action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)){//执行结束}}}4、发送设备:selectDevice = mBluetoothAdapter.getRemoteDevice(address);端口:clientSocket = selectDevice.createRfcommSocketToServiceRecord(MY_UUID); 连接设备:clientSocket.connect()获取输出流:os = clientSocket.getOutputStream();输出数据:os.write(String.getBytes("UTF-8"));5、接收通过UUID监听请求:serverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);取得端口:socket = serverSocket.accept();获取输入流:is = socket.getInputStream();获取输出流:os = socket.getOutputStream();解析数据:创建一个128字节的缓冲byte[] buffer = new byte[128];每次读取128字节,并保存其读取的角标int count = is.read(buffer);创建Message类,向handler发送数据Message msg = new Message();发送一个String的数据,让他向上转型为obj类型msg.obj = new String(buffer, 0, count, "utf-8");handle中解析msg-----(String)msg.obj。
Android Bluetooth opp package 学习笔记一、背景及相关知识学习1、Android Bluetooth SDK首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permission android:name="android.permission.BLUETOOTH" />。
我们可以通过intent调用android.bluetooth.opp包下的activity也可以直接调用android.bluetooth包使用android的蓝牙功能。
方法如下:通过android.bluetooth.opp包我们需要作的是:打开蓝牙:Intemt enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enabler,reCode);//同startActivity(enabler);通过android.bluetooth包我们需要做的是以下几点:1.BluetoothAdapter 顾名思义,蓝牙适配器,直到我们建立bluetoothSocket连接之前,都要不断操作它BluetoothAdapter里的方法很多,常用的有以下几个:cancelDiscovery() 根据字面意思,是取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索disable()关闭蓝牙enable()打开蓝牙getAddress()获取本地蓝牙地址getDefaultAdapter()获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdaptergetName()获取本地蓝牙名称getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备getState()获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)isDiscovering()判断当前是否正在查找设备,是返回trueisEnabled()判断蓝牙是否打开,已打开返回true,否则,返回falselistenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步 startDiscovery()开始搜索,这是搜索的第一步2.BluetoothDevice看名字就知道,这个类描述了一个蓝牙设备createRfcommSocketToServiceRecord(UUID uuid)根据UUID创建并返回一个BluetoothSocket这个方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket这个类其他的方法,如getAddress(),getName(),同BluetoothAdapter3.BluetoothServerSocket如果去除了Bluetooth相信大家一定再熟悉不过了,既然是Socket,方法就应该都差不多,这个类一种只有三个方法两个重载的accept(),accept(int timeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接,close()关闭!4.BluetoothSocket,跟BluetoothServerSocket相对,是客户端一共5个方法,不出意外,都会用到close(),关闭connect()连接getInptuStream()获取输入流getOutputStream()获取输出流getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备2、Android Bluetooth 底层知识Android蓝牙协议栈使用的是BlueZ,支持GAP, SDP, and RFCOMM规范,是一个SIG认证的蓝牙协议栈。
Bluetooth Low Energy——蓝牙低功耗Android4.3(API级别18)引入内置平台支持BLE的central角色,同时提供API和app应用程序用来发现设备,查询服务,和读/写characteristics。
与传统蓝牙(ClassicBluetooth)不同,蓝牙低功耗(BLE)的目的是提供更显著的低功耗。
这使得Android 应用程序可以和具有低功耗的要求BLE设备,如接近传感器,心脏速率监视器,健身设备等进行通信。
关键术语和概念下面是关键BLE术语和概念的总结:通用属性规范(GATT)—GATTprofile是一个通用规范用于在BLE链路发送和接收被称为―属性(attributes)‖的数据片。
目前所有的低功耗应用profile都是基于GATT。
蓝牙SIG定义了许多profile用于低功耗设备。
Profile(配置文件)是一个规范,规范了设备如何工作在一个特定的应用场景。
注意:一个设备可以实现多个profile。
例如,一个设备可以包含一个心脏监测仪和电池电平检测器。
属性协议(ATT )—GATT是建立在属性协议(ATT )的顶层,通常也被称为GATT/ ATT 。
ATT进行了优化用于在BLE设备上运行。
为此,它采用尽可能少的字节越好。
每个attribute 属性被UUID(通用唯一标识符)唯一标识,UUID是标准128-bit格式的ID用来唯一标识信息。
attributes 被ATT 格式化characteristics和services形式进行传送。
特征(Characteristics)—一个characteristics包含一个单独的value值和0 –n个用来描述characteristic 值(value)的descriptors。
一个characteristics可以被认为是一种类型的,类似于一个类。
描述符(descriptor)—descriptor是被定义的attributes,用来描述一个characteristic的值。
例如,一个descriptor可以指定一个人类可读的描述中,在可接受的范围里characteristic值,或者是测量单位,用来明确characteristic的值。
服务(service)—service是characteristic的集合。
例如,你可以有一个所谓的―Heart RateMonitor‖service,其中包括characteristic,如―heart rate measurement ‖。
你可以在找到关于一系列基于GATT的profile和service。
角色和职责以下是适用于当一个Android设备与BLE设备交互的角色和责任:中心设备(central)与外围设备(peripheral)。
这也适用于BLE连接本身。
Central设备进行扫描,寻找advertisenment,peripheral设备发出advertisement。
GATT server(服务器)与GATTclient(客户端)。
这决定了两个设备建立连接后如何互相交互。
要了解它们的区别,假设你有一个Android手机和活动跟踪器,活动跟踪器是一个BLE装置。
这款手机扮演central角色;活动跟踪器扮演peripheral角色(建立一个BLE连接,必须具备两者。
如果两个设备只支持central角色或peripheral角色,不能跟对方建立一个BLE连接)。
一旦手机与活动跟踪器已经建立连接,他们开始相互传送GATT数据。
根据它们传送数据的种类,其中一个可能作为GATT server。
例如,如果该活动跟踪器将传感器数据汇报到手机上,活动跟踪器作为server。
如果活动跟踪器想要从手机接收更新,那么手机作为server。
在本文档中使用的示例中,Android应用程序(在Android设备上运行)是GATT client。
该应用从GATT server 获取数据,server是一款支持HeartRate Profile的BLE心脏速率监测仪。
但你可以设计你的Android应用程序,作为GATT server角色。
见BluetoothGattServer获取更多信息。
BLE权限为了使用应用程序中的蓝牙功能,你必须声明蓝牙权限BLUETOOTH。
你需要这个权限执行任意蓝牙通讯,如请求连接,接受连接,传输数据。
如果你希望你的应用程序启动设备发现或操纵蓝牙设置,还必须声明BLUETOOTH_ADMIN权限。
注意:如果您使用BLUETOOTH_ADMIN权限,那么你还必须有BLUETOOTH权限。
声明蓝牙权限在你的应用程序清单(manifest)文件。
例如:<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>如果你想声明,你的应用程序是只提供给BLE功能的设备,在您的应用程序的清单包括如下语句:<uses-feature android:name="android.hardware.bluetooth_le"android:required="true"/>不过,如果你想使你的应用程序提供给那些不支持BLE设备,你仍然应该在您的应用程序的清单包含这个上述语句,但设置required="false"。
然后在运行时可以通过使用PackageManager.hasSystemFeature()确定BLE可用性:// Use this check to determine whether BLE is supported on the device. Then// you can selectively disable BLE-related features.if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOO TH_LE)) {Toast.makeText(this, R.string.ble_not_supported,Toast.LENGTH_SHORT).show();finish();}设置BLE在你的应用程序可以进行BLE通信之前,你需要验证这个设备上BLE是否被支持,如果支持,请确保它已启用。
请注意,如果<uses-feature.../>设置为false,这个检查才是必需的。
如果不支持BLE ,那么你应该适当地禁用任何BLE功能。
如果BLE支持,但被禁用,那么你可以要求用户启动蓝牙时不要离开应用程序。
这种设置两个步骤完成,使用BluetoothAdapter.1.获取BluetoothAdapter该BluetoothAdapter是所有的蓝牙活动所必需的。
该BluetoothAdapter代表设备自身的蓝牙适配器(蓝牙无线电)。
只有一个蓝牙适配器用于整个系统,并且你的应用程序可以使用该对象进行交互。
下面的代码片段显示了如何获取适配器。
注意,该方法使用getSystemService()返回BluetoothManager的一个实例, 用于获取适配器。
Android 4.3 (API级别18 )引入BluetoothManager:// Initializes Bluetooth adapter.final BluetoothManager bluetoothManager= (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter();2. 启用蓝牙接下来,你需要确保蓝牙已启用。
用isEnabled()来检查蓝牙当前是否启用。
如果此方法返回false,那么蓝牙被禁用。
下面的代码片段检查蓝牙是否开启。
如果不是,该片段将显示错误提示用户去设置以启用蓝牙:private BluetoothAdapter mBluetoothAdapter;...// Ensures Bluetooth is available on the device and it is enabled. If not, // displays a dialog requesting user permission to enable Bluetooth.if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);}查找BLE设备为了找到BLE设备,您可以使用startLeScan()方法。
此方法需要一个BluetoothAdapter.LeScanCallback作为参数。
你必须实现这个回调,因为它决定扫描结果如何返回。
因为扫描耗电量大,你应当遵守以下准则:1)只要你找到所需的设备,停止扫描。
2)不要扫描一个循环,并设置您的扫描时间限制。
以前可用的设备可能已经移出范围,继续扫描消耗电池电量。
下面的代码片段显示了如何启动和停止扫描:/*** Activity for scanning and displaying available BLE devices.*/public class DeviceScanActivity extends ListActivity {private BluetoothAdapter mBluetoothAdapter;private boolean mScanning;private Handler mHandler;// Stops scanning after 10 seconds.private static final long SCAN_PERIOD = 10000;...private void scanLeDevice(final boolean enable) {if (enable) {// Stops scanning after a pre-defined scan period.mHandler.postDelayed(new Runnable() {@Overridepublic void run() {mScanning = false;mBluetoothAdapter.stopLeScan(mLeScanCallback);}}, SCAN_PERIOD);mScanning = true;mBluetoothAdapter.startLeScan(mLeScanCallback);} else {mScanning = false;mBluetoothAdapter.stopLeScan(mLeScanCallback);}...}...}如何你想要扫描指定类型的peripheral设备,你可以用startLeScan(UUID[],BluetoothAdapter.LeScanCallback)取代, 它提供了一组UUID对象用于说明你的应用程序支持的GATT services .下面是用于传送BLE扫描结果的接口函数BluetoothAdapter.LeScanCallback的具体实现:private LeDeviceListAdapter mLeDeviceListAdapter;...// Device scan callback.private BluetoothAdapter.LeScanCallback mLeScanCallback =new BluetoothAdapter.LeScanCallback() {@Overridepublic void onLeScan(final BluetoothDevice device, int rssi,byte[] scanRecord) {runOnUiThread(new Runnable() {@Overridepublic void run() {mLeDeviceListAdapter.addDevice(device);mLeDeviceListAdapter.notifyDataSetChanged();}});}};注意:你可以只扫描BLE设备或传统蓝牙设备,就像Bluetooth描述那样。