1.啟用藍牙並使設備處於可發現狀態 1.1 在使用BluetoothAdapter類的實例進操作之前,應啟用isEnable()方法檢查設備是否啟用了藍牙適配器。 // 使用意圖提示用戶啟用藍牙,並使設備處於可發現狀態 private void startBluetooth() { Bluetoot
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();
}
}
}