Android 蓝牙操作详解

简介: 1.启用蓝牙并使设备处于可发现状态        1.1 在使用BluetoothAdapter类的实例进操作之前,应启用isEnable()方法检查设备是否启用了蓝牙适配器。       // 使用意图提示用户启用蓝牙,并使设备处于可发现状态      private void s...

1.启用蓝牙并使设备处于可发现状态    


   1.1 在使用BluetoothAdapter类的实例进操作之前,应启用isEnable()方法检查设备是否启用了蓝牙适配器。
 
    // 使用意图提示用户启用蓝牙,并使设备处于可发现状态
      private  void  startBluetooth() {
          BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
            // 检测蓝牙是否开启
            if  (!bt.isEnabled()) {
              Intent enableIntent =  new  Intent(
                        BluetoothAdapter.  ACTION_REQUEST_ENABLE );
              startActivityForResult(enableIntent,  REQUEST_ENABLE_BT );
          }
     }
 1.2返回意图活动时,调用onActivityResult(),可以提取主设备名称和 mac地址
 
  protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
            if  (requestCode ==  REQUEST_ENABLE_BT
                   && resultCode == Activity.  RESULT_OK ) {
              BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
              String address = bt.getAddress();
              String name = bt.getName();
              String toastText = name +  " :"  + address;
              Toast. makeText( this , toastText, Toast. LENGTH_LONG ).show();
              discoverable();
          }
     }
1.3 请求用户授权,让设备可被其它临近设备发现:
      // 请求用户授权,让设备在120秒内处于可发现状态
      private  void  discoverable() {
          Intent discoverableIntent =  new  Intent(
                    BluetoothAdapter. ACTION_REQUEST_DISCOVERABLE );
          startActivity(discoverableIntent);
     }

 

2.连接启用蓝牙设备

 
 2.1对于任何蓝牙应用,都必须在AndroidManifst.xml中添加如下权限:
       <uses-permission android:name"android.permission.BLUETOOTH_ADMIN" />
     <uses-permission android:name"android.permission.BLUETOOTH" />
 
  2.2 创建到其他蓝牙设备的套接字连接
     我们应该在一个线程内持续监听套接字流中的数据。可以在该线程外写入连接的流。这种连接是一个阻塞调用,由于蓝牙设备发现是一个缓慢的过程,可能降低连接速率。所以,在连接其它设备之前要取消设备发现。
     蓝牙套接字连接时阻塞调用,只在连接成功或者连接设备发生异常时才会返回。BluetoothConnection一经实例化,就会创建到其他设备的连接,并开始监听来自连接设备的数据。
package com.example.blueoothdemo;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;

/**
* 读写蓝牙设备
*
* @author hbbliyong
*
*/
public class BluetoothConnecion extends Thread {
     private final BluetoothSocket mSocket;
     private final InputStream mInStream;
     private final OutputStream mOutStream;
     byte[] buffer;
     private final BluetoothAdapter mAdapter;
     // 用于本应用程序唯一的UUID,
     private static final UUID MY_UUID = UUID
               .fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");

     public BluetoothConnecion(BluetoothDevice device) {
          BluetoothSocket tmp = null;
          mAdapter = BluetoothAdapter.getDefaultAdapter();
          // 获得用于指定蓝牙连接的BluetoothSocket
          try {
               tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
          } catch (Exception e) {
               e.printStackTrace();
          }
          mSocket = tmp;

          // 在新线程中建立套接字连接,避免FC
          Thread connectionThread = new Thread(new Runnable() {
               @Override
               public void run() {
                    // TODO Auto-generated method stub
                    // 始终取消发现,因为它会降低连接的速度
                    mAdapter.cancelDiscovery();

                    // 建立到BluetoothSocket的连接
                    try {
                         // 这是一个阻塞调用,只在成功连接或者异常时返回
                         mSocket.connect();
                    } catch (Exception e) {
                         e.printStackTrace();
                         // 设备连接失败,关闭套接字
                         try {
                              mSocket.close();
                         } catch (Exception e2) {
                              // TODO: handle exception
                              e2.printStackTrace();
                         }
                    }
               }
          });

          connectionThread.start();

          InputStream tmpIn = null;
          OutputStream tmpOut = null;

          // 获得BluetoothSoket输入输出流
          try {
               tmpIn = mSocket.getInputStream();
               tmpOut = mSocket.getOutputStream();
               buffer = new byte[1024];
          } catch (Exception e) {
               e.printStackTrace();
          }
          mInStream = tmpIn;
          mOutStream = tmpOut;
     }

     public void run() {
          // 连接时保持监听InputStream
          while (true) {
               try {
                    // 从套接字流读取数据
                    mInStream.read(buffer);
                    // 向UI Activity发送获取的数据
               } catch (Exception e) {
                    // TODO: handle exception
                    // 这里的异常标志着连接的丢失
                    // 向UI Activity发送获取的数据
                    break;
               }
          }
     }
    
     public void write(byte[] buffer)
     {
          try {
               mOutStream.write(buffer);
          } catch (Exception e) {
               e.printStackTrace();
          }
     }
    
     public void cancel()
     {
          try {
               mSocket.close();
          } catch (Exception e) {
               // TODO: handle exception
               e.printStackTrace();
          }
     }
}
 

3.监听和接收蓝牙连接请求

 
     在两个蓝牙设备交互之前,其中一个通信设备必须起服务器的作用。它获取一个BluetoothServerSocket实例并监听入站请求。这个实例通过调用蓝牙适配器上的listenUsingRfcommWithServiceRecord()方法获得。有了这个实例我们可以通过start()方法开始监听来自远程设备的入站请求。
 
   //使主设备处于可发现状态
  Intent disCoverableIntent =  new  Intent(
                      BluetoothAdapter.  ACTION_REQUEST_DISCOVERABLE );
  startActivityForResult(disCoverableIntent, DISCOVERY_REQUEST_BLUETOOTH  );
 
 
//创建一个蓝牙服务器并接受连接
protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {
 
            if  (requestCode ==  DISCOVERY_REQUEST_BLUETOOTH  ) {
                boolean  isDiscoverable = resultCode > 0;
                if  (isDiscoverable) {
                     // UUID
                     // uuid=UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666");
                     final  UUID uuid = UUID.randomUUID();
                     final  String serverName =  "BTServer"  ;
                     final  BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
 
                     final  BluetoothServerSocket bluetoothServer;
 
                   Thread listenThread =  new  Thread( new  Runnable() {
 
                          @Override
                          public  void  run() {
                               //  TODO  Auto-generated method stub
                               try  {
                                  bluetoothServer = bt.listenUsingRfcommWithServiceRecord(serverName, uuid);
                    BluetoothSocket serverSocket = bluetoothServer.accept();
                    myHandleConnectionWiht(serverSocket);
 
                             }  catch  (Exception e) {
                                  e.printStackTrace();
                                  
                             }
                        }
 
                          private  void  myHandleConnectionWiht(
                                  BluetoothSocket serverSocket) {
                               //  TODO  Auto-generated method stub
                             
                        }
 
                   });
                   listenThread.start();
              }
          }
     }


目录
相关文章
|
7月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
685 1
|
8月前
|
Android开发
Android kernel 操作gpio
Android kernel 操作gpio
102 0
|
9月前
|
存储 算法 Java
Android 进阶——代码插桩必知必会&ASM7字节码操作
Android 进阶——代码插桩必知必会&ASM7字节码操作
454 0
|
9月前
|
XML API 开发工具
Android Bitmap 加载与像素操作
Android Bitmap 加载与像素操作
73 2
|
10月前
|
Android开发
Android获取蓝牙设备列表的方法
Android获取蓝牙设备列表的方法
624 5
|
10月前
|
定位技术 Android开发
Android 12蓝牙报java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission
Android 12蓝牙报java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission
339 1
|
10月前
|
Android开发
Android监听蓝牙广播
Android监听蓝牙广播
90 1
|
10月前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
284 5
|
10月前
|
Java Android开发
Android系统 获取用户最后操作时间回调实现和原理分析
Android系统 获取用户最后操作时间回调实现和原理分析
266 0
|
10月前
|
Linux Android开发
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
188 0

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 7
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 10
    Android实战经验之Kotlin中快速实现MVI架构
  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    55
  • 2
    android FragmentManager 删除所有Fragment 重建
    25
  • 3
    Android实战经验之Kotlin中快速实现MVI架构
    39
  • 4
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    40
  • 5
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    151
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    50
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    66
  • 9
    Android历史版本与APK文件结构
    169
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54