全栈工程师开发手册 (作者:栾鹏)
安卓教程全解

安卓蓝牙开发全解。启动蓝牙、启动可发现机制、广播监听蓝牙状态、广播监听蓝牙可发现机制状态、发现远程蓝牙设备、蓝牙设备作为服务器端、蓝牙设备作为客户端、蓝牙设备发送接收数据。

获取蓝牙管理

在使用蓝牙前需要先获取系统蓝牙管理

BluetoothAdapter bluetooth;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity1);  //这里的UI文件任意//访问默认的Bluetooth AdapterBluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();   this.bluetooth = bluetooth;}

启动蓝牙、可发现机制

//启动蓝牙private static final int ENABLE_BLUETOOTH = 1;private void initBluetooth() {//判断蓝牙是否打开if (!bluetooth.isEnabled()) { //蓝牙未启动,提示用户打开它Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(intent, ENABLE_BLUETOOTH);} else {//蓝牙已启动,初始化其UIinitBluetoothUI();}}//启用可发现机制
protected static final int DISCOVERY_REQUEST = 1;
private void makeDiscoverable() {startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE),DISCOVERY_REQUEST);Log.v("蓝牙", "准备启动可发现机制");}//根据返回结果,确认蓝牙、可发现机制是否启动protected void onActivityResult(int requestCode,int resultCode, Intent data) {//请求值为是否打开蓝牙if (requestCode == ENABLE_BLUETOOTH)//返回值为蓝牙以打开if (resultCode == RESULT_OK) {//蓝牙已启动,初始化其UIinitBluetoothUI();}if (resultCode==RESULT_CANCELED) {Log.v("蓝牙", "未能成功启动蓝牙");}//请求值为是否允许打开可发现机制if (requestCode == DISCOVERY_REQUEST) {//返回值为取消if (resultCode == RESULT_CANCELED) {Log.v("蓝牙", "未能成功启动可发现机制");}if(resultCode==RESULT_OK){Log.v("蓝牙", "成功启动可发现机制");}}}
//初始化蓝牙UI
private void initBluetoothUI() {Log.v("蓝牙", "蓝牙已启动");
}

广播监听方式获取蓝牙和可发现机制的状态变化

除了根据请求蓝牙和可发现机制启动的返回结果获取蓝牙状态,实际中应用更多的是通过广播监听的方式获取蓝牙和可发现机制的状态变化。

当蓝牙启动或关闭,可发现机制启动或关闭,都会想系统发送广播信息,主要在app中监听这些广播就能获取蓝牙状态。

//广播监听的方式获知蓝牙状态变化
private void surebluetoothstate() {registerReceiver(bluetoothState_receiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
}//监听蓝牙是否打开的广播接收器BroadcastReceiver bluetoothState_receiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {// TODO 自动生成的方法存根String prevStateExtra = BluetoothAdapter.EXTRA_PREVIOUS_STATE;String stateExtra = BluetoothAdapter.EXTRA_STATE;int state=intent.getIntExtra(stateExtra, -1);int previousState = intent.getIntExtra(prevStateExtra, -1);String tt="";switch (state) {case (BluetoothAdapter.STATE_TURNING_ON): tt="蓝牙正在打开"; break;case (BluetoothAdapter.STATE_ON): tt="蓝牙已经打开"; break;case (BluetoothAdapter.STATE_TURNING_OFF): tt="蓝牙正在关闭"; break;case (BluetoothAdapter.STATE_OFF): tt="蓝牙已经关闭"; break;default:break;}Log.v("蓝牙", "广播监听到"+tt);}};//广播监听的方式获知蓝牙可发现机制状态变化private void surebluetoothstate1() {registerReceiver(new BroadcastReceiver(){         //匿名注册接收机@Overridepublic void onReceive(Context context, Intent intent) {// TODO 自动生成的方法存根String prevScanMode= BluetoothAdapter.EXTRA_PREVIOUS_SCAN_MODE;String scanMode = BluetoothAdapter.EXTRA_SCAN_MODE;int currentScanMode=intent.getIntExtra(scanMode, -1);int prevMode = intent.getIntExtra(prevScanMode, -1);//currentScanMode,23表示打开,21表示关闭,20表示蓝牙关闭(蓝牙关闭,可发现自动关闭)String str="可发现机制开启";switch (currentScanMode) {case 23:str="蓝牙开启,可发现机制开启";break;case 21:str="蓝牙开启,可发现机制关闭";break;case 20:str="蓝牙关闭,可发现机制关闭";break;default:break;}Log.d("蓝牙", str);}}, new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED));
}

发现远程蓝牙设备

由于发现远程蓝牙设备比较耗时,所以安卓也是通过异步广播的形式向系统广播发现的蓝牙设备信息。因此需要在自己的app中实现这个广播接收。

//启动发现远程蓝牙设备,使用广播监听获知远程设备的信息
private ArrayList<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>();
private void startDiscovery()
{registerReceiver(discoveryResult,new IntentFilter(BluetoothDevice.ACTION_FOUND));//isEnabled判断蓝牙是否打开,isDiscovering判断蓝牙是否正在扫描if (bluetooth.isEnabled() && !bluetooth.isDiscovering())deviceList.clear();bluetooth.startDiscovery();
}//发现远程设备的过程是异步的,安卓使用broadcast intent来依次通知发现过程的启动和结束以及在扫描过程中发现的远程设备    //注册一个接收器,接收这个广播事件BroadcastReceiver discoveryResult = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String remoteDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//BluetoothDevice device = bluetooth.getRemoteDevice("01:23:77:35:2F:AA");  //也可以通过硬件地址获取设备,deviceList.add(remoteDevice);Log.d("蓝牙", "发现到远程设备" + remoteDeviceName);}};

蓝牙数据的传输

蓝牙包含一个BluetoothServerSocket连接信道(用于连接信令的传输),一个BluetoothSocket数据信道(用于服务器端和客户端数据的传输)。

两个蓝牙设备,一个作为服务器端,一个作为客户端。

服务器端代码

//作为服务器端,监听客户端蓝牙socket连接请求。private BluetoothSocket transferSocket;private UUID startServerSocket(BluetoothAdapter bluetooth) {UUID uuid = UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666");String name = "bluetoothserver";try {final BluetoothServerSocket btserver = bluetooth.listenUsingRfcommWithServiceRecord(name, uuid);Thread acceptThread = new Thread(new Runnable() {public void run() {try {// 在客户端连接建立以前保持阻塞BluetoothSocket Socket = btserver.accept();//可以先发送消息// 开始监听信息StringBuilder incoming = new StringBuilder();listenForMessages(Socket, incoming);// 添加对用来到来消息的套接字的引用,以便本机进行发送数据transferSocket = Socket;} catch (IOException e) {Log.e("蓝牙", "服务器 连接 IO 出错", e);}}});acceptThread.start();} catch (IOException e) {Log.e("蓝牙", "Socket 监听 IO 出错", e);}return uuid;}

客户端代码

//创建一个蓝牙客户端套接字private void connectToServerSocket(BluetoothDevice device, UUID uuid) {try{BluetoothSocket clientSocket = device.createRfcommSocketToServiceRecord(uuid);// 阻塞直到服务器接受连接clientSocket.connect();//可以先发送消息//开始监听消息StringBuilder incoming = new StringBuilder();listenForMessages(clientSocket, incoming);// 添加对用于发送信息的套接字的引用transferSocket = clientSocket;} catch (IOException e) {Log.e("蓝牙", "蓝牙客户端 I/O 出错", e);}}

服务器端或客户端的发送数据函数

 //使用Bluetooth Sockets发送数据private void sendMessage(BluetoothSocket socket, String message) {OutputStream outStream;try {outStream = socket.getOutputStream();//添加一个终止符byte[] byteArray = (message + " ").getBytes();byteArray[byteArray.length - 1] = 0;outStream.write(byteArray);} catch (IOException e) { Log.e("蓝牙", "消息发送失败", e);}}

服务器端或客户端的接收数据函数

//使用Bluetooth Sockets接收数据private boolean listening = false;private void listenForMessages(BluetoothSocket socket, StringBuilder incoming) {listening = true;int bufferSize = 1024;byte[] buffer = new byte[bufferSize];try {InputStream instream = socket.getInputStream();int bytesRead = -1;while (listening) {bytesRead = instream.read(buffer);if (bytesRead != -1) {String result = "";while ((bytesRead == bufferSize) &&(buffer[bufferSize-1] != 0)){result = result + new String(buffer, 0, bytesRead - 1);bytesRead = instream.read(buffer);}result = result + new String(buffer, 0, bytesRead - 1);incoming.append(result);}socket.close();}} catch (IOException e) {Log.e("蓝牙", "消息接收失败", e);}finally {}}

安卓蓝牙bluetooth开发全解相关推荐

  1. 安卓电话和网络开发全解:电话硬件检测、电话服务信息、sim信息、网络服务信息、数据连接和数据传输信息、电话状态监听

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓电话和网络开发全解,包括电话硬件检测.电话服务信息.sim信息.网络服务信息.数据连接和数据传输信息.通过phone state listener ...

  2. 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓短信功能全解:调用系统短信功能发送短信.彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信. 首先需要 ...

  3. Android 蓝牙BLE开发详解

    Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...

  4. 安卓自定义相机录像功能全解(不调用系统相机)

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓录制视频需要使用MediaRecorder来完成.并且在录制中一般还需要SurfaceHolder进行实时预览,所以在布局文件中进行预览的Surf ...

  5. 基于经典蓝牙的安卓蓝牙APP开发(基于蓝牙2.0开发,例:HC-05)

    基于经典蓝牙的安卓蓝牙开发-串口 一.展现广播的三种方式 1.通知: 2.对话框: 3.消息提示框 2.在使用Android蓝牙适配器中的startDiscovery需要先打开定位服务 3.在连接蓝牙 ...

  6. python后台架构Django开发全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 我的使用环境win8+python3.6+pycharm+django2.0 博主使用的是anaconda佩戴的python3.6,所以pyt ...

  7. Echarts数据可视化event图表事件的相关操作,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  8. Echarts数据可视化action图表行为的相关操作,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  9. Echarts数据可视化echarts实例的相关操作,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

最新文章

  1. 薛XX后代的IQ CSU1597【循环节】或【快速幂】
  2. Runtime应用(三)实现NSCoding的自动归档和自动解档
  3. IOS客户端rtmp
  4. 直播 | 北邮博士生纪厚业:异质图神经网络在阿里推荐业务中的探索
  5. 2016谷歌官方最新eclipse工程导入studio,以前方式全部废弃。不能再使用。
  6. 将您重定向的次数过多什么意思_忙忙碌碌将爱麻木是什么歌-所以会忙忙碌碌将爱麻木歌曲意思、出处、含义介绍...
  7. magento 优化 php.ini,PHP.ini配置文件(中文) | Magento UI
  8. SQL-92标准 中文翻译——定义、记号和约定 (记号)
  9. Linux调试工具strace和gdb常用命令小结-转
  10. l如何更新linux内核,WSL更新Linux内核版本
  11. python自动搜索最佳超参数之GridSearchCV函数
  12. 浮动QQ在线客服代码,兼容各大浏览器
  13. 逆向基础——软件手动脱壳技术入门
  14. 金山词霸划译功能对IDE的影响
  15. 金蝶中间件公司CTO袁红岗
  16. 《开源之迷》:每天那么多人念叨的开源,究竟该如何解读?
  17. 星际争霸2:自由之翼 作弊秘籍
  18. 《计算机网络:自顶向下方法(原书第七版)》 参考答案(英文版+中文版)
  19. 三星i908、iPhone3G对比评测
  20. 23-TCP 协议(紧急标志)

热门文章

  1. 今天的语音识别,我们就用Python来做,从基础的知识到实践的运用
  2. excel根据条件列转行_Excel vba-根据不同筛选条件筛选后,拆分成新的excel工作簿...
  3. JavaScript-箭头函数
  4. 天玑800处理器支持鸿蒙系统吗,为何Redmi Note 9选择天玑800U处理器?和骁龙750G差距多大...
  5. 小试ImageMagik——使用篇
  6. mysql c库 示例_选择MySQL数据库进行连接的简单示例
  7. html 自定义标签 ios,iOS标签 | 菜鸟教程
  8. php cli运行获取参数,php cli传递参数的方法
  9. android 多个c文件编译成一个so,AndroidStudio使用CMakeLists.txt编译多个so库
  10. pip 指定版本安装