博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 蓝牙操作详解
阅读量:7126 次
发布时间:2019-06-28

本文共 4868 字,大约阅读时间需要 16 分钟。

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();
              }
          }
     }

转载地址:http://tzeel.baihongyu.com/

你可能感兴趣的文章
Mongod的复制
查看>>
Linux中find常见用法示例
查看>>
浅谈系统性能优化
查看>>
搭建Python环境与Python文件类型
查看>>
安装Tengine php mysql
查看>>
实战:mysql检查物理磁盘中的二进制日志文件是否有丢失
查看>>
检查mysql错误日志并发邮件通知
查看>>
【linux+C】通过几个实例温习指针
查看>>
华为刀片网卡漂移问题
查看>>
搜索专题:Balloons
查看>>
使用shell脚本采集系统cpu、内存、磁盘、网络等信息
查看>>
数据包的分类和调度-Linux TC的另一种解释
查看>>
Nginx服务器平滑升级
查看>>
yum [Errno 256] No more mirrors to try 解决方法
查看>>
第 3 章 Keystone - 018 - 理解 Keystone 核心概念
查看>>
Top 10 Methods for Java Arrays
查看>>
Ex2010-14 Access Ex2013 ECP/OWA in a co-existence scenario
查看>>
Linux命令详解 -- iptables
查看>>
IOS开发知识(四)
查看>>
张涵20160401作业
查看>>