Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android 蓝牙操作详解

Android 蓝牙操作详解

作者头像
hbbliyong
发布于 2018-03-06 03:05:55
发布于 2018-03-06 03:05:55
1.7K00
代码可运行
举报
文章被收录于专栏:hbbliyonghbbliyong
运行总次数:0
代码可运行

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

   1.1 在使用BluetoothAdapter类的实例进操作之前,应启用isEnable()方法检查设备是否启用了蓝牙适配器。

    // 使用意图提示用户启用蓝牙,并使设备处于可发现状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 请求用户授权,让设备可被其它临近设备发现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 请求用户授权,让设备在120秒内处于可发现状态
 private void discoverable() {
          Intent discoverableIntent = new Intent(
 BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
          startActivity(discoverableIntent);
     }

2.连接启用蓝牙设备

 2.1对于任何蓝牙应用,都必须在AndroidManifst.xml中添加如下权限:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <uses-permission android:name= "android.permission.BLUETOOTH_ADMIN" />
 <uses-permission android:name= "android.permission.BLUETOOTH" />

2.2 创建到其他蓝牙设备的套接字连接

     我们应该在一个线程内持续监听套接字流中的数据。可以在该线程外写入连接的流。这种连接是一个阻塞调用,由于蓝牙设备发现是一个缓慢的过程,可能降低连接速率。所以,在连接其它设备之前要取消设备发现。

     蓝牙套接字连接时阻塞调用,只在连接成功或者连接设备发生异常时才会返回。BluetoothConnection一经实例化,就会创建到其他设备的连接,并开始监听来自连接设备的数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()方法开始监听来自远程设备的入站请求。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //使主设备处于可发现状态
  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();
              }
          }
     }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-07-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[Android实例] android 蓝牙开发浅析
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
易寒
2021/12/21
5430
Android 蓝牙开发(一)蓝牙通信「建议收藏」
<uses-permissionandroid:name=”android.permission.BLUETOOTH” />
全栈程序员站长
2022/09/14
4.2K0
Android 蓝牙开发(1)
Android 平台包含蓝牙网络堆栈支持,凭借此支持,设备能以无线方式与其他蓝牙设备交换数据。应用框架提供了通过 Android Bluetooth API 访问蓝牙功能的途径。使用 Bluetooth API Android 应用可以执行下面的操作:
开发者
2019/12/26
2.5K0
Android 蓝牙操作
该BluetoothAdapter可以执行基本的蓝牙任务,例如启动设备发现,查询配对的设备列表,使用已知的MAC地址实例化一个BluetoothDevice类,并创建一个BluetoothServerSocket监听来自其他设备的连接请求
码客说
2019/10/22
1.5K0
android开发之蓝牙主动配对连接手机
上一篇介绍了手机配对连接的三种方式,这篇以完整的一个代码实例介绍如何搜索周围的蓝牙设备,以及主动配对,连接。
全栈程序员站长
2022/03/11
7510
android开发之手机与单片机蓝牙模块通信
之前两篇都是在说与手机的连接,连接方法,和主动配对连接,都是手机与手机的操作,做起来还是没问题的,但是最终的目的是与单片机的蓝牙模块的通信。
全栈程序员站长
2022/03/11
8120
android开发之蓝牙配对连接的方法「建议收藏」
最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看了不少蓝牙方面的文档,做了个关于蓝牙连接的小结。
全栈程序员站长
2022/03/11
3.9K0
Android蓝牙详析 | 蓝牙的适配、权限、开启、搜索发现等处理
本系列笔记概述 蓝牙传输优势:功耗低,传输距离还可以; 蓝牙聊天室案例 Android中蓝牙设备的使用 蓝牙权限(本文的讲解内容之一) 蓝牙功能开启(本文的讲解内容之一) 搜索蓝牙设备(本文的讲解内容之一) 与外设搭建RFCOMM通道(射频通道) 蓝牙设备双向数据传输 蓝牙聊天室案例框架 蓝牙权限 执行蓝牙通信需要权限BLUETOOTH, 例如:请求连接、接收连接和传输数据等; 如果需要启动设备 或 操作蓝牙设置,则需声明BLUETOOTH_ADMIN权限 <uses-permiss
凌川江雪
2019/05/17
6.6K0
【Android 应用开发】BluetoothAdapter解析
这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每个常量含义. 
韩曙亮
2023/03/27
2.2K0
Android项目实战(二十六):蓝牙连接硬件设备开发规范流程
前言:   最近接触蓝牙开发,主要是通过蓝牙连接获取传感器硬件设备的数据,并进行处理。   网上学习一番,现整理出一套比较标准的 操作流程代码。   如果大家看得懂,将来只需要改下 硬件设备的MAC码 和 改下对接收数据的处理 即可。  一切都是套路~~~ 现在以一个小型项目需求来学习Android蓝牙编程 需求: 通过蓝牙获取硬件数据,并显示在一个随数据即时变化的动态折线图中。 实现思路: (1) 配对蓝牙设备   (2) 连接蓝牙设备    ,根据MAC地址,代码中修改 (3) 接收数据 (4) 处理数
听着music睡
2018/05/18
1.6K0
通过蓝牙实现安卓手机远程控制
本文将介绍如何通过蓝牙连接实现对安卓手机的远程控制。我们将探讨在安卓应用程序中设置蓝牙服务,以及如何使用Python编写一个蓝牙客户端,向手机发送命令,实现点击、滑动和返回等操作。通过该技术,你可以创建一个简单而强大的远程控制系统,方便在特定场景下控制手机操作。
测试开发囤货
2023/11/21
1.7K0
通过蓝牙实现安卓手机远程控制
Android在app中实现蓝牙服务Service的案例
在Android应用中,你可以通过服务(Service)来实现蓝牙数据读取。以下是一个简单的示例,演示如何创建一个Android服务以连接到蓝牙设备并读取数据。在实际应用中,你需要确保你的应用具备蓝牙权限,并使用合适的蓝牙库进行连接和数据读取。
丹牛Daniel
2023/10/17
1.2K0
android蓝牙4.0的知识要点
这次主要讲解蓝牙4.0的基本要点,作为自己的备忘录记录下来吧。首先普及一下蓝牙4.0基于Gatt协议来实现。而蓝牙4.0以下的是传统蓝牙,基于socket方式来实现。所以4.0以上的蓝牙具有传输速度更快,覆盖范围更广,安全性更高,延迟更短,耗电极低等等优点。
HelloJack
2018/08/28
1.1K0
android蓝牙4.0的知识要点
蓝牙API介绍及基本功能实现
通过监听BluetoothAdapter.ACTION_STATE_CHANGED监听蓝牙状态的改变
fanfan
2022/05/07
1.5K0
Android:能接收HC05数据的APP
本项目需要制作一款APP,实现手机蓝牙和HC-05蓝牙模块连接,接收来自单片机的数据,并在APP页面上进行实时显示。
zstar
2022/06/14
8220
Android:能接收HC05数据的APP
Android开发笔记(一百六十二)蓝牙设备的连接与配对
蓝牙是一种短距离无线通信技术,它由爱立信公司于1994年创制,原本想替代连接电信设备的数据线,但是后来发现它也能用于移动设备之间的数据传输,所以蓝牙技术在手机上获得了长足发展。 因为手机内部的通讯芯片一般同时集成了2G/3G/4G、WIFI和蓝牙,所以蓝牙功能已经是智能手机的标配了。若想进行蓝牙方面的开发,需要在App工程的AndroidManifest.xml中补充下面的权限配置:
aqi00
2019/01/18
3.4K0
Android 蓝牙源码学习笔记
上文介绍了蓝牙基本原理和潜在的攻击面,但实现部分介绍不多。本文作为补充,以 Android 中的蓝牙协议栈为例,学习并了解在实际系统中蓝牙的工程实现。
evilpan
2023/02/12
2.6K0
Android 蓝牙源码学习笔记
相关推荐
[Android实例] android 蓝牙开发浅析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验