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-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permissionandroid: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(); } } }

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android(安卓)布局单位转换
  3. 开发者必读jQuery Mobile入门教程
  4. android系统对linux内核的主要补丁
  5. Android(安卓)中 控制 wifi
  6. android4.0 通过DHCP方式实现以太网连接
  7. android连接真机 调试未测试
  8. 详解OkSocket与Android的简单使用
  9. Android(安卓)网络连接:HttpUtils 的GET、POST与注解

随机推荐

  1. android代码分析,及Terminal使用
  2. Android(安卓)使用USB与PC通信之ADB方式
  3. Android(安卓)自定义圆形进度条 带刻度进
  4. Android Root刷机资源 & Google Nexus资
  5. Gradle依赖总结
  6. andriod cs 架构
  7. Ionic Html5编译IOS Android原生应用
  8. Android(安卓)OpenGLES2.0 渲染ffmpeg解
  9. Android 环境变量访问类
  10. android各个平台区别