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