Android蓝牙开发经典笔记,程序和说明
Android开发之蓝牙(Bluetooth)操作(一)--扫描已经配对的蓝牙设备

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

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蓝牙通信

发现,握手,验证,连接
基本环境准备
表现层
业务层
Android 平台
表现层UI设计
基本环境准备
表现层
业务层
Android 平台
业务层-扫描已配对的蓝牙设备
业务层编码主要是调用平台的API。
① 获得BluetoothAdapter对象。 ② 判断当前设备中是否拥有蓝牙设备。 ③ 判断当前设备中蓝牙是否打开。 ④ 得到已经配对的蓝牙设备对象。
Android 手机应用开发 第九章 Android蓝牙操作(一)
3G软件学院
讲师: 刘彬 讲师:
复习上节课内容
① 如何实现Android 应用程序的国际化。
② 建立常驻程序的完成步骤。
第九章:
学习目标:
Android 蓝牙通信(一)
什么是蓝牙。 了解 Android 蓝牙通讯的基本结构。 掌握 Android 蓝牙通信的权限。 建立 蓝牙通讯协议配置步骤。 实例 Android扫描周围已配对的蓝牙 设备。
第四步: Android Framework 管理蓝牙连接
基本环境准备
表现层
业务层
Android 平台
第一步:设置蓝牙通信
使用 BluetoothAdapter 类,获得 BluetoothAdapter 对象与启动蓝牙通信。 1)取得 BluetoothAdapter 类
2) 启动蓝牙通信
基本环境准备
1 . 服务端连接 2. 客户端连接
基本环境准备
表现层
业务层
Android 平台
第四步:管理蓝牙连接
当成功连接一个或多个蓝牙设备时,每一个蓝牙设备都 有一条连接BluetoothSocket, 此时蓝牙设备彼此间可以传递数据。
android蓝牙智能解锁笔记

关于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。
达内android开发笔记(11)

达内总达内总部部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开发之蓝牙

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。
android 蓝牙开发教程

蓝牙是啥我就不再说了,因为我肯定解释不清楚蓝牙是啥,有兴趣请移步至百度百科。
在开始前我们需要准备好一部手机而不是模拟器,且手机已经打开调试模式并连接到电脑上。
文中的本地设备均指我们自己的手机,而远程设备则是指其他的设备(电脑、其他手机或者其他)。
通常情况下,我们对蓝牙的操作主要有:开启和关闭蓝牙、搜索周边设备、能被周边设备所发现、获取配对设备、蓝牙设备间的数据传输。
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。
b e a c o n 蓝 牙 入 门 教 - 程 ( 2 0 2 0 )

低功耗蓝牙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 更为方便的运用。
android蓝牙调用笔记

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 学习笔记

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认证的蓝牙协议栈。
android 蓝牙开发(DOC)

Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输。
本文档描述了怎样利用android平台提供的蓝牙API去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备;寻找局域网内可能或者匹配的设备;连接设备;设备之间的数据传输。
以下是建立蓝牙连接的所需要的一些基本类:BluetoothAdapter类:代表了一个本地的蓝牙适配器。
他是所有蓝牙交互的的入口点。
利用它你可以发现其他蓝牙设备,查询绑定了的设备,使用已知的MAC地址实例化一个蓝牙设备和建立一个BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。
BluetoothDevice类:代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态。
(其信息是封装在bluetoothsocket中)。
Bluetoothsocket类:代表了一个蓝牙套接字的接口(类似于tcp中的套接字),他是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。
Blueboothserversocket类:代表打开服务连接来监听可能到来的连接请求(属于server端),为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。
当远端设备发起连接请求的时候,并且已经连接到了的时候,Blueboothserversocket类将会返回一个bluetoothsocket。
Bluetoothclass类:描述了一个蓝牙设备的一般特点和能力。
他的只读属性集定义了设备的主、次设备类和一些相关服务。
然而,他并没有准确的描述所有该设备所支持的蓝牙文件和服务,而是作为对设备种类来说的一个小小暗示。
下面说说具体的编程实现:首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" /><uses-permissionandroid:name="android.permission.BLUETOOTH" />其次,必须确定你的设备支持蓝牙,并保证他可以用。
Android蓝牙开发教程(一)

Android蓝牙开发教程(一)Android蓝牙功能的开发一直是很多新手头疼的问题,网上虽然也有很多教程贴,但大多都写得不全面,不能让我们真正掌握蓝牙开发的基本知识。
本教程主要讲解搜索蓝牙设备、蓝牙设备之间的连接和蓝牙之间的通讯三个主要模块。
掌握了这三个,基本就能进行简单的蓝牙开发了。
先上效果图界面比较简单。
主要有三个按钮,两个文本和一个列表。
三个按钮主要对应打开蓝牙,搜索设备和发送信息三个功能。
两个文本主要用于提示连接状态和发送的消息以及获取的消息。
列表主要展示搜索到的蓝牙设备。
源码在后面会提供。
要用到蓝牙的功能,需要先在manifest中声明一下蓝牙的使用权限<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>打开蓝牙设备BluetoothAdapter bTAdatper = BluetoothAdapter.getDefaultAdapter();if(bTAdatper==null){Toast.makeText(this,"当前设备不支持蓝牙功能",Toast.LENGTH_SHORT).show();}if(!bTAdatper.isEnabled()){/* Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivity(i);*/bTAdatper.enable();}//开启被其它蓝牙设备发现的功能if (bTAdatper.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//设置为一直开启i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);startActivity(i);}开启蓝牙需要用到BluetoothAdapter,我们可以通过BluetoothAdapter.ACTION_REQUEST_ENABLE 提示用户开启,也可以bTAdatper.enable()直接开启蓝牙。
Android之蓝牙驱动开发总结

Android之蓝牙驱动开发总结二Android Bluetooth架构 (1)2.1 Bluetooth架构图 (1)2.2 Bluetooth代码层次结构 (3)三Bluetooth协议栈分析 (4)3.1 蓝牙协议栈 (4)3.2 Android与蓝牙协议栈的关系 (5)四Bluetooth之HCI层分析 (5)4.1 HCI层与基带的通信方式 (6)4.2 包的分析及研究 (7)4.3 通信过程的研究与分析 (8)五Bluetooth之编程实现 (8)5.1 HCI层编程 (8)5.2 L2CAP层编程 (10)5.3 SDP层编程 (12)六Bluetooth之启动过程实现 (13)6.1 Bluetooth启动步骤 (14)6.2 Bluetooth启动流程 (14)6.3 Bluetooth数据流向 (14)6.4 Bluez控制流程 (14)6.5 Bluetooth启动过程分析 (15)七Bluetooth之驱动移植 (15)7.1 android系统配置 (15)7.2 启动项修改 (16)7.3 电源管理rfkill驱动 (16)7.4 Rebuild Android image and reboot (16)7.5 实现BT睡眠唤醒机制 (16)7.6 系统集成 (17)八Bluetooth之调试与编译 (17)8.1 Bluetooth驱动调试 (17)九Bluetooth之应用程序开发 (18)9.1 Bluetooth的API开发 (18)9.2 The Basics开发 (18)9.3 Bluetooth Permissions开发 (19)9.4 Setting Up Bluetooth服务 (19)9.5 Finding Devices服务 (20)9.6 Connecting Devices服务 (22)9.7 Managing a Connection服务 (26)9.8 Working with Profiles服务 (28)十总结与疑问 (29)一Bluetooth基本概念蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、甚至家用电器采用无线方式联接起来。
Andorid蓝牙开发详细教程

2. 软件开发
图 1 JDK 配置环境
开发环境搭建好之后,我们便进入到具体的软件开发。Android 从 2.0 之后 才支持蓝牙 API,Android 本身对蓝牙设备的操作进行了封装以方便我们的调用。 Android 蓝 牙 使 用 的 是 Bluez 协 议 栈 。 本 程 序 主 要 用 到 以 下 几 个 类 : BluetoothAdapter 类 、 BluetoothDevice 类 、 Bluetoothsocket 类 以 及 Blueboothserversocket 类。
Android 蓝牙安全通信
陈颖 高国勇 张帆 杭州电子科技大学通信工程学院
当我们对手机通话司空见惯的时候,文字聊天也成为了人们所非常喜爱的方 式。人们常常按着手机上的微型数字键盘,快速发着短信 SMS(Short Messaging Service)。短信的发送是基于控制通道的通路与手机发射塔进行通信,这就意味 着在某些情况下如手机信号微弱、手机信号被关闭(飞行模式,关闭无线电信号) 的情况下,短信将无法发送,这时候人们是不是就不能聊天了呢?答案是否定的: 手机除了基于无线信号的通信之外,还有基于蓝牙的通信、基于 WiFi 的通信等 等多种方式。对于 Android 平台,它对这些通信方式的开发支持得非常好。实际 上,Android 平台的手机功能应用开发支持非常广泛,我们能够基于 Android 平 台提供的支持开发出各种各样的应用,例如:我们可以将蓝牙或者 WiFi 短消息 聊天与 Android 的传感器开发结合起来,开发类似于微信的 Android 应用:通过 摇一摇来找到周围的朋友,继而进行聊天等。本文尝试设计一个 Android 平台下 基于蓝牙的安全通讯软件,通过蓝牙连接进行加密短消息通信,以作抛砖引玉。 其进一步的开发(如与传感器开发的结合等),留作将来的工作。
android蓝牙简单开发示例教程

android蓝⽛简单开发⽰例教程⽬录概述1、权限申请2、打开蓝⽛3、接收蓝⽛状态的改变4、扫描其他的设备5、蓝⽛配对6、获取已经配对的设备7、连接设备概述前段时间学习了⼀些蓝⽛开发的知识,记录⼀下Android中蓝⽛的简单开发。
下⾯是最重要的两个类。
BluetoothAdapter : 蓝⽛适配器,通过getDefaultAdapter ()去获取⼀个实例,如果设备不⽀持蓝⽛的话,返回的是⼀个null对象,通过它,可以打开、关闭蓝⽛,扫描设备、向指定设备创建socket通道…BluetoothDevice : 代表⼀个设备对象,可以通过它获取设备的名字、地址、类型等,也可以创建匹配,建⽴socket通道等等。
1、权限申请<uses-permission android:name="android.permission.BLUETOOTH"/> 使⽤蓝⽛所需要的权限<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 使⽤扫描和设置蓝⽛的权限(申明这⼀个权限必须申明上⾯⼀个权限)Android6以上版本,扫描其他蓝⽛还需要位置权限// Android 9 以下版本<user-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>// Android 9 以上<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>2、打开蓝⽛mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 如果设备不⽀持蓝⽛if (mBluetoothAdapter == null){return;}// 设备⽀持蓝⽛功能,调⽤startActivityForResult去启动蓝⽛if (!mBluetoothAdapter.isEnabled()){unch(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));}打开蓝⽛功能是通过startActivity去启动的,但是startActivity这个函数已经过期了,所以我使⽤官⽅推荐的Activity Result替代它ActivityResultLauncher<Intent> startBlueTooth = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),new ActivityResultCallback<ActivityResult>() {@Overridepublic void onActivityResult(ActivityResult result) {if (result==null){Toast.makeText(BlueToothActivity.this, "open failed", Toast.LENGTH_SHORT).show();}else {if (result.getResultCode() == RESULT_CANCELED){Toast.makeText(BlueToothActivity.this,"⽤户取消",Toast.LENGTH_SHORT);}}}});3、接收蓝⽛状态的改变通过⼴播去接收蓝⽛状态的改变class BluetoothStateChangeReceiver extends BroadcastReceiver{public int DEFAULT_VALUE_BLUETOOTH = 1000;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,DEFAULT_VALUE_BLUETOOTH); switch(state){case BluetoothAdapter.STATE_ON:Log.d(TAG, "onReceive: open");break;case BluetoothAdapter.STATE_OFF:Log.d(TAG, "onReceive: off");break;case BluetoothAdapter.STATE_TURNING_ON :Log.d(TAG, "onReceive: 正在打开");break;case BluetoothAdapter.STATE_TURNING_OFF:Log.d(TAG, "onReceive: 正在关闭");break;}}}}别忘了⼴播的注册和解注册IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);stateReceiver = new BluetoothStateChangeReceiver() ;registerReceiver(stateReceiver,filter);4、扫描其他的设备同样通过⼴播接收,action是BluetoothDevice.ACTION_FOUNDclass MyReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothDevice.ACTION_FOUND.equals(action)) {// 从intent对象中获取蓝⽛设备的信息BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);// 当发现新设备不存在于配对列表中时添加if (device.getBondState() != BluetoothDevice.BOND_BONDED) {blueNames.add(device.getName()+"\t"+device.getAddress());}blueAdpater.notifyDataSetChanged();Log.d(TAG, "onReceive: " + device.getName());}}}动态注册⼴播IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(mReceiver,filter);开启扫描mBluetoothAdapter.startDiscovery();5、蓝⽛配对public class BondReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())){BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);switch(device.getBondState()){case BluetoothDevice.BOND_BONDED:Log.d(TAG, "onReceive: 配对完成");break;case BluetoothDevice.BOND_BONDING:Log.d(TAG, "onReceive: 正在配对");break;case BluetoothDevice.BOND_NONE:Log.d(TAG, "onReceive: 取消配对");break;}}}}6、获取已经配对的设备已经配对的设备会被存储起来,通过BluetoothAdpater直接获取即可Set<BluetoothDevice> paireDevices = mBluetoothAdapter.getBondedDevices();if (paireDevices.size()>0){for (BluetoothDevice pairedDevice : pairedDevices) {blueNames.add(pairedDevice.getName()+" "+pairedDevice.getAddress());Log.d(TAG, "onClick: "+pairedDevice.getName());}}7、连接设备想要在两台设备之间创建连接,必须实现客户端和服务端机制,他们之间使⽤套接字机制进⾏连接,服务端开放服务器套接字,客户端通过MAC地址向服务端发起连接。
android蓝牙bleapp开发(二)--关键概念,连接参数,连接请求

android蓝牙bleapp开发(二)--关键概念,连接参数,连接请求Android蓝牙ble app开发中经常会遇到很多问题,这个时候就需要用到抓包软件进行分析,单单从现象上很难鉴定是设备固件端的问题,还是我们自己app写的不对的问题。
这一点是做android的是比较纠结的,因为固件端经常是和iOS通信没毛问题,android问题偶尔,这个偶尔很经常出现。
(固件基于cc2540 2541)这篇记录的内容是android app开发时遇到的,但是本身的内容却是ble协议的一些内容,ios 也是一样的下一篇会记录下抓包过程与分析。
1、知识储备:要分析ble蓝牙包需要懂一些ble蓝牙协议栈的内容,和一些核心概念。
最关键的几个概念Connection Events:连接事件这个概念比较抽象,之前看了很多解释不明白,ti 宣讲会上讲ppt 讲的很清楚简单的说就是通信建立在连接事件上,每次连接事件时才是真正的通信事件,其余时间时休眠的(低功耗)对应在程序上就是如果连接间隔的时间设置的大于通信间隔,就会出现数据通信不流畅,没有接收到周期性数据,数据一卡顿一卡顿时而没有时而很多Supervision Timeout:超时时间(在这个时间内没有接收到响应就会断开)Slave Latency:这个不好翻译,看图最实在了理解成可以忽略的空白响应数吧Connection Interval:连接间隔简单的理解成连两个连接事件之间的间隔时间呗另外还有:Advertisement InterVals 广播间隔,和名字一个意思2、关于更新连接参数ConnectionParameter Update Request有阅读蓝牙协议栈和一些材料,简单的说就是主机决定连接参数的值( connection interval, slave latency, timeout),从机可以请求更新这些参数,主机决定是不是接受,接受的值是多少。
android蓝牙开发程序说明

GHOSTYU谷雨BluetoothLeGatt说明Android ble程序2014/1/9[在此处键入文档的摘要。
摘要通常是对文档内容的简短总结。
在此处键入文档的摘要。
摘要通常是对文档内容的简短总结。
]前言BluetoothLeGatt是在Android提供的api19(android4.4) Sample基础上修改而来,原来的demo只有read,我们把read改为write,这样可以使用4.3以上的android手机来想开发板发送16进制数据或者字符串数据。
BluetoothLeGatt程序我们仍然在更新,未来的名字可能叫做HiGatt,所以我们现在提供的apk安装包叫做HiGatt.apk,由于源码中的名称未改,所以安装后的app名仍然为BluetoothLeGattBluetoothLeGatt使用Android Stuido开发,需要api18、19支持。
该程序只能运行在支持蓝牙4.0的Android4.3以上的手机上使用。
操作说明使用源码编译到手机或者直接安装我们提供的apk,然后运行HiGatt程序,如果系统为打开蓝牙,会提示你打开蓝牙功能。
为了演示,需要准备一个SmartRF开发板,并且烧写串口透传中的从机程序(可以接收多个字节的数据)。
上电运行该程序。
如下左图,HiGatt扫描到从机。
单击搜索到的从机,会执行连接操作,连接之后,程序会自动去find services,并且会罗列出全部的service,如下右图。
单击uuid为000fff0-0000-1000-8000-00805f9b34fb的Service,程序会find characteristics,并且列出全部的characteristic,可能大家对这个uuid会感觉很陌生,其实他就是我们平时最常见的simpleprofile中的自定义的service 0xFFF0,只不过一个是16位的uuid,一个是128位的uuid,16为bit和128位转换,在SIG的core_v4.0文档中有说明,两种办法,第一种是通过一个复杂的计算公式,第二种是简单的填充,就像2中把0xfff0,填充到000xxxx-0000-1000-8000-00805f9b34fb中的xxxx0xfff0的所有characteristics如下左图,点击uuid为0xfff1的characteristic,会弹出Write Characteristic的对话框。
android蓝牙开发的基本流程

android蓝牙开发的基本流程
1. 检查当前设备是否支持蓝牙功能:首先,要确认当前设备是否支持蓝牙,可以通
过BluetoothAdapter对象来检查。
2. 启用蓝牙功能:如果发现设备不支持蓝牙功能,则可以调用BluetoothAdapter方
法enable()来启用蓝牙。
3. 当不能直接启用蓝牙功能时,需要请求额外的权限:如果不能直接启用蓝牙功能,则可以使用Intent的ACTION_REQUEST_ENABLE来请求额外的权限。
调用startActivityForResult方法后App会显示来自系统的提示框,用户可以在其中输入额外的权限信息。
4. 实例化BluetoothDevice对象:为了发现服务和特性,需要建立BluetoothDevice 对象的实例。
通常可以使用getRemoteDevice方法,该方法可以接收一个MAC地址参数。
5. 建立连接:下一步要建立连接。
调用BluetoothDevice实例的connectGatt()方法来建立连接。
6. 搜索服务:当连接建立成功,就可以使用BluetoothGatt对象来发现服务。
8. 使用特性:最后,可以使用找到的特性进行通信,从而实现蓝牙功能。
以上就是Android蓝牙开发的基本流程。
除了上面提到的步骤之外,还可以添加其他
一些额外的功能,以实现更加灵活和完善的蓝牙功能。
Android蓝牙开发实例解析

Android蓝⽛开发实例解析在使⽤⼿机时,蓝⽛通信给我们带来很多⽅便。
那么在Android⼿机中怎样进⾏蓝⽛开发呢?本⽂以实例的⽅式讲解Android蓝⽛开发的知识。
1、使⽤蓝⽛的响应权限XML/HTML代码<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>2、配置本机蓝⽛模块在这⾥⾸先要了解对蓝⽛操作⼀个核⼼类BluetoothAdapter。
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();//直接打开系统的蓝⽛设置⾯板Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(intent, 0x1);//直接打开蓝⽛adapter.enable();//关闭蓝⽛adapter.disable();//打开本机的蓝⽛发现功能(默认打开120秒,可以将时间最多延长⾄300秒)Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//设置持续时间(最多300秒)3、搜索蓝⽛设备使⽤BluetoothAdapter的startDiscovery()⽅法来搜索蓝⽛设备。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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描述那样。