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()方法来搜索蓝牙设备。

startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。

请求Discovery后,系统开始搜索蓝牙设备,在这个过程中,系统会发送以下三个广播:

ACTION_DISCOVERY_START:开始搜索

ACTION_DISCOVERY_FINISHED:搜索结束

ACTION_FOUND:找到设备,这个Intent中包含两个extra fields:EXTRA_DEVICE和EXTRA_CLASS,分别包含BluetooDevice和BluetoothClass。

我们可以自己注册相应的BroadcastReceiver来接收响应的广播,以便实现某些功能。

// 创建一个接收ACTION_FOUND广播的BroadcastReceiver  

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {  

 public void onReceive(Context context, Intent intent) {  

  String action = intent.getAction();  

  // 发现设备  

  if (BluetoothDevice.ACTION_FOUND.equals(action)) {  

   // 从Intent中获取设备对象  

   BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  

   // 将设备名称和地址放入array adapter,以便在ListView中显示  

   mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
  }
 }
};  

// 注册BroadcastReceiver  

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);  

registerReceiver(mReceiver, filter); // 不要忘了之后解除绑定 

        4、蓝牙Socket通信

如果打算建议两个蓝牙设备之间的连接,则必须实现服务器端与客户端的机制。当两个设备在同一个RFCOMM channel下分别拥有一个连接的BluetoothSocket,这两个设备才可以说是建立了连接。

服务器设备与客户端设备获取BluetoothSocket的途径是不同的。服务器设备是通过accepted一个incoming connection来获取的,而客户端设备则是通过打开一个到服务器的RFCOMM channel来获取的。

       服务器端的实现

通过调用BluetoothAdapter的listenUsingRfcommWithServiceRecord(String, UUID)方法来获取BluetoothServerSocket(UUID用于客户端与服务器端之间的配对)。

调用BluetoothServerSocket的accept()方法监听连接请求,如果收到请求,则返回一个BluetoothSocket实例(此方法为block方法,应置于新线程中)。

如果不想在accept其他的连接,则调用BluetoothServerSocket的close()方法释放资源(调用该方法后,之前获得的BluetoothSocket实例并没有close。但由于RFCOMM一个时刻只允许在一条channel中有一个连接,则一般在accept一个连接后,便close掉BluetoothServerSocket)。

private class AcceptThread extends Thread {  

 private final BluetoothServerSocket mmServerSocket;  

 public AcceptThread() {  

  // Use a temporary object that is later assigned to mmServerSocket,  

  // because mmServerSocket is final  

  BluetoothServerSocket tmp = null;  

  try {  

   // MY_UUID is the app's UUID string, also used by the client code
   tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
  } catch (IOException e) { }
  mmServerSocket = tmp;
 }  

 public void run() {
  BluetoothSocket socket = null;  

  // Keep listening until exception occurs or a socket is returned  

  while (true) {
   try {
    socket = mmServerSocket.accept();
   } catch (IOException e) {
    break;
   }  

   // If a connection was accepted
   if (socket != null) {
    // Do work to manage the connection (in a separate thread)
    manageConnectedSocket(socket);
    mmServerSocket.close();
    break;
   }
  }
 }   

 /** Will cancel the listening socket, and cause the thread to finish */
 public void cancel() {
  try {
   mmServerSocket.close();
  } catch (IOException e) { }
 }
} 

   客户端的实现

通过搜索得到服务器端的BluetoothService。

调用BluetoothService的listenUsingRfcommWithServiceRecord(String, UUID)方法获取BluetoothSocket(该UUID应该同于服务器端的UUID)。

调用BluetoothSocket的connect()方法(该方法为block方法),如果UUID同服务器端的UUID匹配,并且连接被服务器端accept,则connect()方法返回。

注意:在调用connect()方法之前,应当确定当前没有搜索设备,否则连接会变得非常慢并且容易失败。

private class ConnectThread extends Thread {
 private final BluetoothSocket mmSocket;  

 private final BluetoothDevice mmDevice;  

 public ConnectThread(BluetoothDevice device) {  

  // Use a temporary object that is later assigned to mmSocket,  

  // because mmSocket is final  

  BluetoothSocket tmp = null;  

  mmDevice = device;  

  // Get a BluetoothSocket to connect with the given BluetoothDevice  

  try {  

   // MY_UUID is the app's UUID string, also used by the server code
   tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
  } catch (IOException e) { }
  mmSocket = tmp;
 }  

 public void run() {
  // Cancel discovery because it will slow down the connection
  mBluetoothAdapter.cancelDiscovery();
  try {
   // Connect the device through the socket. This will block
   // until it succeeds or throws an exception
   mmSocket.connect();
  } catch (IOException connectException) {  

   // Unable to connect; close the socket and get out
   try {
    mmSocket.close();
   } catch (IOException closeException) { }
    return;
  }  

   // Do work to manage the connection (in a separate thread)
  manageConnectedSocket(mmSocket);
 }  

 /** Will cancel an in-progress connection, and close the socket */
  public void cancel() {
  try {
   mmSocket.close();  

  } catch (IOException e) { }
  }
} 

       5、连接管理(数据通信)

分别通过BluetoothSocket的getInputStream()和getOutputStream()方法获取InputStream和OutputStream。

使用read(bytes[])和write(bytes[])方法分别进行读写操作。

注意:read(bytes[])方法会一直block,知道从流中读取到信息,而write(bytes[])方法并不是经常的block(比如在另一设备没有及时read或者中间缓冲区已满的情况下,write方法会block)。

private class ConnectedThread extends Thread {  

 private final BluetoothSocket mmSocket;  

 private final InputStream mmInStream;  

 private final OutputStream mmOutStream;  

 public ConnectedThread(BluetoothSocket socket) {  

  mmSocket = socket;  

  InputStream tmpIn = null;  

  OutputStream tmpOut = null;  

  // Get the input and output streams, using temp objects because  

  // member streams are final  

  try {  

   tmpIn = socket.getInputStream();  

   tmpOut = socket.getOutputStream();  

  } catch (IOException e) { }  

  mmInStream = tmpIn;  

  mmOutStream = tmpOut;  

 }  

 public void run() {  

  byte[] buffer = new byte[1024]; // buffer store for the stream  

  int bytes; // bytes returned from read()  

  // Keep listening to the InputStream until an exception occurs  

  while (true) {  

   try {  

    // Read from the InputStream  

    bytes = mmInStream.read(buffer);  

    // Send the obtained bytes to the UI Activity  

    mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)  

      .sendToTarget();  

   } catch (IOException e) {  

    break;  

   }  

  }  

 }  

 /* Call this from the main Activity to send data to the remote device */  

 public void write(byte[] bytes) {  

  try {  

   mmOutStream.write(bytes);  

  } catch (IOException e) { }  

 }  

 /* Call this from the main Activity to shutdown the connection */  

 public void cancel() {  

  try {  

   mmSocket.close();  

  } catch (IOException e) { }  

 }  

}  

以上就Android 蓝牙的开发简单示例代码,后续继续整理相关资料,谢谢大家对本站的支持!

(0)

相关推荐

  • Android设备间实现蓝牙(Bluetooth)共享上网

    Android设备之间可以除了通过wifi热点共享上网,还可以通过蓝牙共享上网,后面这个功能很少人使用,但适合某台设备没有wifi却有蓝牙的情况. 一.设置WT19i,系统设置>无线连接>网络共享>开启蓝牙共享网络(这步很多人忽略,导致无法上网) 二.开启N7 二代蓝牙并配对,返回WT19i,已配对设备>配置>开启互联网连接共享 三.设置N7 二代,已配对设备>配置>开启互联网访问(第二步主机共享没开启的话这里也无法开启) 测试效果良好,访问网络正常,Androi

  • Android开发中编写蓝牙相关功能的核心代码讲解

    一. 什么是蓝牙(Bluetooth)? 1.1  BuleTooth是目前使用最广泛的无线通信协议 1.2  主要针对短距离设备通讯(10m) 1.3  常用于连接耳机,鼠标和移动通讯设备等. 二. 与蓝牙相关的API 2.1 BluetoothAdapter: 代表了本地的蓝牙适配器 2.2 BluetoothDevice 代表了一个远程的Bluetooth设备 三. 扫描已经配对的蓝牙设备(1) 注:必须部署在真实手机上,模拟器无法实现 首先需要在AndroidManifest.xml 声

  • Android蓝牙开发深入解析

    1. 使用蓝牙的响应权限 复制代码 代码如下: <uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 2. 配置本机蓝牙模块 在这里首先要了解对蓝牙操作一个核心类BluetoothAdapter 复制代码 代码如下: Bluetoot

  • Android提高之蓝牙传感应用实例

    前面文章介绍了Android利用麦克风采集并显示模拟信号的实现方法,这种采集手段适用于无IO控制.单纯读取信号的情况.如果传感器本身需要包含控制电路(例如采集血氧信号需要红外和红外线交替发射),那么传感器本身就需要带一片主控IC,片内采集并输出数字信号了.Android手机如何在不改硬件电路的前提下与这类数字传感器交互呢?可选的通信方式就有USB和蓝牙,两种方式各有好处:USB方式可以给传感器供电,蓝牙方式要自备电源:USB接口标准不一,蓝牙普遍支持SPP协议.本文就选择蓝牙方式做介绍,介绍An

  • Android单片机与蓝牙模块通信实例代码

    啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通过参考网上资料,问题顺利搞定,下面小编把具体实现思路分享给大家,供大家参考. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码(Universally Unique Identifier),这是一个软件构建的标准,也是被开源基金会组织应用在分布式计算环境领域的一部分.在蓝牙3.0及下一版本中,UUID被用于唯一标识一个服务,比如文件传输服务,串口服务.打印机服务等,如下: #蓝牙串

  • Android蓝牙通信编程

    项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助.  以下是开发中的几个关键步骤: 1.首先开启蓝牙  2.搜索可用设备  3.创建蓝牙socket,获取输入输出流  4.读取和写入数据 5.断开连接关闭蓝牙 下面是一个蓝牙聊天demo  效果图: 在使用蓝牙是 BluetoothAdapter 对蓝牙开启,关闭,获取设备列表,发现设备,搜索等核心功能 下面对它进行封装: package com.xiaoyu.bluetooth; import java.

  • Android系统中的蓝牙连接程序编写实例教程

    Bluetooth结构 1.JAVA层 frameworks/base/core/java/android/bluetooth/ 包含了bluetooth的JAVA类. 2.JNI层 frameworks/base/core/jni/android_bluetooth_开头的文件 定义了bluez通过JNI到上层的接口. frameworks/base/core/jni/android_server_bluetoothservice.cpp 调用硬件适配层的接口system/bluetooth/

  • Android Bluetooth蓝牙技术使用流程详解

    在上篇文章给大家介绍了Android Bluetooth蓝牙技术初体验相关内容,感兴趣的朋友可以点击了解详情. 一:蓝牙设备之间的通信主要包括了四个步骤 设置蓝牙设备 寻找局域网内可能或者匹配的设备 连接设备 设备之间的数据传输 二:具体编程实现 1. 启动蓝牙功能 首先通过调用静态方法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,如果返回为空,则无法继续执行了.例如: BluetoothAdapter mBluetoothAdapter = Blueto

  • android实现蓝牙文件发送的实例代码,支持多种机型

    最近项目上需要实现蓝牙传输apk的一个功能,能够搜索周围的蓝牙手机并分享文件.从需求上讲android手机自带的蓝牙传输模块就可以满足需要了,实现也很简单.不过让人头疼的是,虽然说一般的主流机型都配置有蓝牙模块,但是android机型碎片化太严重,不同android版本手机蓝牙功能也不一样.4.0.3以下版本和以上版本使用的蓝牙包是不同的,分别是"com.android.bluetooth"和"com.mediatek.bluetooth".还有一些厂商对蓝牙模块进

  • Android实现的简单蓝牙程序示例

    本文实例讲述了Android实现的简单蓝牙程序.分享给大家供大家参考,具体如下: 我将在这篇文章中介绍了的Android蓝牙程序.这个程序就是将实现把手机变做电脑PPT播放的遥控器:用音量加和音量减键来控制PPT页面的切换. 遥控器服务器端 首先,我们需要编写一个遥控器的服务器端(支持蓝牙的电脑)来接收手机端发出的信号.为了实现这个服务器端,我用到了一个叫做Bluecove(专门用来为蓝牙服务的!)的Java库. 以下是我的RemoteBluetoothServer类: public class

  • Android 蓝牙2.0的使用方法详解

    本文为大家分享了Android操作蓝牙2.0的使用方法,供大家参考,具体内容如下 1.Android操作蓝牙2.0的使用流程 (1)找到设备uuid (2)获取蓝牙适配器,使得蓝牙处于可发现模式,获取下位机的socket,并且与上位机建立建立连接,获取获取输入流和输出流,两个流都不为空时,表示连接成功.否则是连接失败. (3).与下位机的socket开始通信. (4).通信结束后,断开连接(关闭流,关闭socket) 2接下来接直接上代码: 2.1找到设备uuid(一般厂商都会给开发者提供) 复

  • Android蓝牙通信聊天实现发送和接受功能

    很不错的蓝牙通信demo实现发送和接受功能,就用了两个类就实现了,具体内容如下 说下思路把 主要有两个类 主界面类 和 蓝牙聊天服务类 . 首先创建线程 实际上就是创建BluetoothChatService() (蓝牙聊天服务类) 这个时候把handler 传过去 这样就可以操作UI 界面了,在线程中不断轮询读取蓝牙消息,当主界面点击发送按钮时 调用BluetoothChatService 的发送方法write 方法,这里的write 方法 使用了handler 发送消息,在主界面显示,另一个

  • Android编程之蓝牙测试实例

    本文实例讲述了Android编程之蓝牙测试.分享给大家供大家参考.具体分析如下: 一.软件平台: win7 + eclipse + sdk 二.设计思路: 配合倒计时定时器实现蓝牙打开,可见,扫描三个功能 三.源代码: main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

随机推荐