本文转载自:http://blog.csdn.net/vnanyesheshou/article/details/51554852

随着可穿戴设备的流行,研究蓝牙是必不可少的一门技术了。

总结了下蓝牙开发使用的一些东西分享一下。

首先需要AndroidManifest.xml文件中添加操作蓝牙的权限。

<uses-permissionandroid:name="Android.permission.BLUETOOTH" />

允许程序连接到已配对的蓝牙设备。

<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />

允许程序发现和配对蓝牙设备。

操作蓝牙主要用到的类 BluetoothAdapter类,使用时导包

import android.bluetooth.BluetoothAdapter;

源码具体位置frameworks/base/core/Java/android/bluetooth/BluetoothAdapter.java

 

BluetoothAdapter 代表本地设备的蓝牙适配器。该BluetoothAdapter可以执行基本的蓝牙任务,例如启

动设备发现,查询配对的设备列表,使用已知的MAC地址实例化一个BluetoothDevice类,并创建一个

BluetoothServerSocket监听来自其他设备的连接请求。

获取蓝牙适配器

  1. BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

开启蓝牙

  1. if(!mBluetoothAdapter.isEnabled()){
  2. //弹出对话框提示用户是后打开
  3. Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  4. startActivityForResult(enabler, REQUEST_ENABLE);
  5. //不做提示,直接打开,不建议用下面的方法,有的手机会有问题。
  6. // mBluetoothAdapter.enable();
  7. }

获取本地蓝牙信息

  1. //获取本机蓝牙名称
  2. String name = mBluetoothAdapter.getName();
  3. //获取本机蓝牙地址
  4. String address = mBluetoothAdapter.getAddress();
  5. Log.d(TAG,"bluetooth name ="+name+" address ="+address);
  6. //获取已配对蓝牙设备
  7. Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();
  8. Log.d(TAG, "bonded device size ="+devices.size());
  9. for(BluetoothDevice bonddevice:devices){
  10. Log.d(TAG, "bonded device name ="+bonddevice.getName()+" address"+bonddevice.getAddress());
  11. }

打印:

  1. D/MainActivity(16800): bluetooth name =Coolpad 8297 address =18:DC:56:D2:30:BD
  2. D/MainActivity(16800): bonded device size =1
  3. D/MainActivity(16800): bonded device name =小米手机 addressF8:A4:5F:02:B1:8F

搜索设备

mBluetoothAdapter.startDiscovery();

开始搜索设备,该过程是异步的,通过下面注册广播接受者,可以监听是否搜到设备。

  1. IntentFilter filter = new IntentFilter();
  2. //发现设备
  3. filter.addAction(BluetoothDevice.ACTION_FOUND);
  4. //设备连接状态改变
  5. filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
  6. //蓝牙设备状态改变
  7. filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
  8. registerReceiver(mBluetoothReceiver, filter);

监听扫描结果

  1. private BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver(){
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. String action = intent.getAction();
  5. Log.d(TAG,"mBluetoothReceiver action ="+action);
  6. if(BluetoothDevice.ACTION_FOUND.equals(action)){//每扫描到一个设备,系统都会发送此广播。
  7. //获取蓝牙设备
  8. BluetoothDevice scanDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  9. if(scanDevice == null || scanDevice.getName() == null) return;
  10. Log.d(TAG, "name="+scanDevice.getName()+"address="+scanDevice.getAddress());
  11. //蓝牙设备名称
  12. String name = scanDevice.getName();
  13. if(name != null && name.equals(VnApplication.BLUETOOTH_NAME)){
  14. mBluetoothAdapter.cancelDiscovery();
  15. //取消扫描
  16. mProgressDialog.setTitle(getResources().getString(R.string.progress_connecting));                   //连接到设备。
  17. mBlthChatUtil.connect(scanDevice);
  18. }
  19. }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
  20. }
  21. }
  22. };

mBlthChatUtil.connect(scanDevice)连接到设备,

此方法中主要是获取socket客户端,并连接。

BluetoothSocket  mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);

mmSocket.connect();

当然有客户端就有服务端了,服务端应先开启,并一直等待客户端连接。直到连接成功。

  1. private class AcceptThread extends Thread {
  2. // serverSocket
  3. private final BluetoothServerSocket mServerSocket;
  4. public AcceptThread() {
  5. BluetoothServerSocket tmp = null;
  6. // 创建一个新的侦听服务器套接字
  7. try {
  8. tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
  9. } catch (IOException e) {
  10. Log.e(TAG, "listen() failed", e);
  11. }
  12. mServerSocket = tmp;
  13. }
  14. public void run() {
  15. if (D) Log.d(TAG, "BEGIN mAcceptThread" + this);
  16. setName("AcceptThread");
  17. BluetoothSocket socket = null;
  18. // 循环,直到连接成功
  19. while (mState != STATE_CONNECTED) {
  20. try {
  21. // 这是一个阻塞调用和将只返回一个
  22. // 成功的连接或例外
  23. socket = mServerSocket.accept();
  24. } catch (IOException e) {
  25. Log.e(TAG, "accept() failed", e);
  26. break;
  27. }
  28. // 如果连接被接受
  29. if (socket != null) {
  30. synchronized (BluetoothChatUtil.this) {
  31. switch (mState) {
  32. case STATE_LISTEN:
  33. case STATE_CONNECTING:
  34. // 正常情况。启动连接螺纹。
  35. connected(socket, socket.getRemoteDevice());
  36. break;
  37. case STATE_NONE:
  38. case STATE_CONNECTED:
  39. // 没有准备或已连接。socket终止。
  40. try {
  41. socket.close();
  42. } catch (IOException e) {
  43. Log.e(TAG, "Could not close unwanted socket", e);
  44. }
  45. break;
  46. }
  47. }
  48. }
  49. }
  50. if (D) Log.i(TAG, "END mAcceptThread");
  51. }
  52. }

当连接成功后,connected(mmSocket, mmDevice); 获取输入输出流,从而进行通信。

private  InputStream mmInStream = socket.getInputStream();

private  OutputStream mmOutStream =socket.getOutputStream();

mmOutStream.write(buffer);发送信息。

mmInStream.read(buffer); 收到消息。

有时候扫描不到设备,需要设备蓝牙可见,这样才能被搜索到。

设置蓝牙可见性

  1. Intent discoveryIntent = new Intent(
  2. BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
  3. discoveryIntent.putExtra(
  4. BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//时间300s,
  5. startActivity(discoveryIntent);

demo下载

Android蓝牙通讯【转】的更多相关文章

  1. android 蓝牙通讯编程 备忘

    1.启动App后: 判断->蓝牙是否打开(所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统),根据Activity返回进场 ...

  2. android蓝牙通讯开发(详细)

    新建一个工程之后,我们可以先看到界面左边的项目栏,我们可以看到,除了app目录以外,大多数的文件和目录都是自动生成的,我们也不需要对他们进行修改,而app目录之下的文件才是我们工作的重点.下面,我先对 ...

  3. Delphi XE5 android 蓝牙通讯传输

    不多讲,直接上代码了. 代码来自网络 http://files.cnblogs.com/nywh2008/Bluetooth_LEDs_android.rar

  4. Android蓝牙串口通讯【转】

    本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...

  5. Android学习——蓝牙通讯

    蓝牙蓝牙,是一种支持设备短距离通信(一般10m内,且无阻隔媒介)的无线电技术.能在包括移动电话.PDA.无线耳机.笔记本电脑等众多设备之间进行无线信息交换.利用“蓝牙”技术,能够有效的简化移动通信终端 ...

  6. Android蓝牙开发教程(三)——蓝牙设备相互通讯

    在上一篇中已经介绍如何连接我们搜索到的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(二)——连接蓝牙设备 在上一篇文章中,无论是自动连接还是被动连接,连接成功后,都是将获 ...

  7. android 蓝牙4.0 开发介绍

    最近一直在研究一个蓝牙功能 由于本人是菜鸟  学起来比较忙 一直搞了好久才弄懂 , 网上对蓝牙4.0也就是几个个dome 抄来抄去,全是英文注解 , 对英语不好的朋友来说 真是硬伤 , 一些没必要的描 ...

  8. 深入了解Android蓝牙Bluetooth——《基础篇》

    什么是蓝牙?   也可以说是蓝牙技术.所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的.利用"蓝牙"技术,能够有效地简化掌上电脑.笔记本电 ...

  9. Android蓝牙学习笔记

    一 Bluetooth基本概念 蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备.计算机及其终端设备.各种数字数据系统.甚至家用电器采用无线方式联接起来.它的传输距离为10cm-10m,如果增加 ...

随机推荐

  1. 关于insert|update|delete注入中的tips

    2.updatexml().extractvalue().name_const()函数的使用 3.I’ve noticed some variations in our payload. You ca ...

  2. eclipse 如何把java项目转成web项目

    经常在eclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目. 解决步骤: 1.进入项目目录,可看到.project文件,打开. 2.找到<natures> ...

  3. 楼梯跳跃代码web

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. java Map 实现类的对比

    java为数据结构中的映射定义了一个接口 java.util.Map ,他有四个实现类

  5. PHP RSA加解密示例(转)

    1.生成密钥和公钥 开始前需要准备openssl环境 linux 需要安装openssl工具包,传送门http://www.openssl.org/source/ window 下需要安装openss ...

  6. 多域名THINKPHP利用MEMCACHE方式共享SESSION数据(转)

    一.问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的各个模块中都是可以登录使 ...

  7. dede二级导航与二级栏目 ----内容介绍二级导航

    {dede:channelartlist typeid='top'}//如果只需要拿一列,则需要使用row='1'这个属性否则会根据子频道的数目循环输出 <a href="{dede: ...

  8. jquery插件中使用ajax并且获取使用插件的对象

    jquery插件中使用ajax后无法在里面获取this 解决办法是在函数内使用ajax前声明变量 $this=this 然后再ajax中使用$this

  9. Spring MVC学习纲要

    感慨一下 之前用过Spring MVC, MyBatis,但是很久不用之后发现很多知识点都荒废了,毕竟工作就是重复,重复再重复.没有啥新东西.所以还是找个时间把忘了的东西捡起来.万一搞了个大bug,然 ...

  10. _DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径

    #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4] ...