https://blog.csdn.net/qinjuning/article/details/7726093
一灰羽、 BluetoothAdapter類介紹
1、BluetoothAdapter STATE 狀態(tài)值 炭臭, 即開關(guān)狀態(tài)
int STATE_OFF 藍牙已經(jīng)關(guān)閉
int STATE_ON 藍牙已經(jīng)打開
int STATE_TURNING_OFF 藍牙處于關(guān)閉過程中 ,關(guān)閉ing
int STATE_TURNING_ON 藍牙處于打開過程中 褐耳,打開ing
2骑脱、BluetoothAdapter SCAN_MOD狀態(tài)值 ,即掃描狀態(tài)
可以掃描其他設(shè)備的称鳞,當然它同時能被其他藍牙設(shè)備掃碼涮较。
int SCAN_MODE_CONNECTABLE 表明該藍牙可以掃描其他藍牙設(shè)備
int SCAN_MODE_CONNECTABLE_DISCOVERABLE
表明該藍牙設(shè)備同時可以掃碼其他藍牙設(shè)備,并且可以被其他藍牙設(shè)備掃描到冈止。
int SCAN_MODE_NONE : 該藍牙不能掃描以及被掃描狂票。
3、獲得藍牙適配器實例
public static synchronized BluetoothAdapter getDefaultAdapter ()
功能:獲得本設(shè)備的藍牙適配器實例靶瘸。
返回值:如果設(shè)備具備藍牙功能苫亦,返回BluetoothAdapter 實例毛肋;否則怨咪,返回null對象。
4润匙、打開/關(guān)閉藍牙的兩種方法:
4.1诗眨、打開藍牙:
①、直接調(diào)用函數(shù)enable()去打開藍牙設(shè)備 孕讳;
②匠楚、系統(tǒng)API去打開藍牙設(shè)備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設(shè)備厂财。
注意:如果藍牙已經(jīng)開啟芋簿,不會彈出該Activity界面。
PS:在目前Android手機中璃饱,是不支持在飛行模式下開啟藍牙的与斤。如果藍牙已經(jīng)開啟,那么藍牙的開關(guān)狀態(tài)會隨著飛行模式的狀態(tài)而發(fā)生改變。
4.2撩穿、關(guān)閉藍牙
直接調(diào)用API 函數(shù)即disable()即可磷支。
public boolean disable ()
功能:關(guān)閉藍牙設(shè)備。
返回值:該函數(shù)會立即返回食寡。
true 表示關(guān)閉操作成功
false 表示藍牙操作失敗 雾狈, ①、當前藍牙已經(jīng)關(guān)閉 抵皱; ②善榛、其他一些異常情況
5、掃描藍牙設(shè)備
public boolean startDiscovery ()
功能: 掃描藍牙設(shè)備
注意: 如果藍牙沒有開啟呻畸,該方法會返回false 锭弊,即不會開始掃描過程。
public boolean cancelDiscovery ()
功能: 取消掃描過程擂错。
注意: 如果藍牙沒有開啟味滞,該方法會返回false。
public boolean isDiscovering ()
功能: 是否正在處于掃描過程中钮呀。
注意: 如果藍牙沒有開啟剑鞍,該方法會返回false。
6爽醋、 獲取藍牙相關(guān)信息
public String getName ()
功能:獲取藍牙設(shè)備Name
public String getAddress ()
功能:獲取藍牙設(shè)備的硬件地址(MAC地址)蚁署,例如:00:11:22:AA:BB:CC
public boolean setName (String name)
功能:設(shè)置藍牙設(shè)備的Name
public Set<BluetoothDevice> getBondedDevices ()
功能:獲取與本機藍牙所有綁定的遠程藍牙信息,以BluetoothDevice類實例返回蚂四。
注意:如果藍牙未開啟光戈,該函數(shù)會返回一個空集合。
public static boolean checkBluetoothAddress (String address)
功能: 驗證藍牙設(shè)備MAC地址是否有效遂赠。所有設(shè)備地址的英文字母必須大寫久妆,48位,形如:00:43:A8:23:10:F1 跷睦。
返回值: true 設(shè)備地址有效
false 設(shè)備地址無效
public BluetoothDevice getRemoteDevice (String address)
功能:以給定的MAC地址去創(chuàng)建一個 BluetoothDevice 類實例(代表遠程藍牙實例)筷弦。即使該藍牙地址不可見,也會產(chǎn)生
一個BluetoothDevice 類實例抑诸。
返回:BluetoothDevice 類實例 烂琴。注意,如果該藍牙設(shè)備MAC地址不能被識別蜕乡,其藍牙Name為null奸绷。
異常:如果MAC address無效,拋出IllegalArgumentException层玲。
7号醉、藍牙相關(guān)廣播
Action值 說明
ACTION_STATE_CHANGED 藍牙狀態(tài)值發(fā)生改變
ACTION_SCAN_MODE_CHANGED 藍牙掃描狀態(tài)(SCAN_MODE)發(fā)生改變
ACTION_DISCOVERY_STARTED 藍牙掃描過程開始
ACTION_DISCOVERY_FINISHED 藍牙掃描過程結(jié)束
ACTION_LOCAL_NAME_CHANGED 藍牙設(shè)備Name發(fā)生改變
ACTION_REQUEST_DISCOVERABLE 請求用戶選擇是否使該藍牙能被掃描
PS:如果藍牙沒有開啟绒瘦,用戶點擊確定后,會首先開啟藍牙扣癣,繼而設(shè)置藍牙能被掃描惰帽。
ACTION_REQUEST_ENABLE 請求用戶選擇是否打開藍牙
ACTION_FOUND (該常量字段位于BluetoothDevice類中,稍后講到)
說明:藍牙掃描時父虑,掃描到任一遠程藍牙設(shè)備時该酗,會發(fā)送此廣播。
最后士嚎,在使用這兩個類時呜魄,需要以下兩個權(quán)限:
BLUETOOTH 值為 "android.permission.BLUETOOTH"
BLUETOOTH_ADMIN 值為 "android.permission.BLUETOOTH_ADMIN"
藍牙連接打印機
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 獲取本地藍牙適配器
if (myBluetoothAdapter != null && myBluetoothAdapter.isEnabled()) {//判斷藍牙可用且已開啟
address = preferences.getString("printAddress", ""); // 查看配置文件中是否保存有藍牙地址
if (!isEmpty(address)) {
Set<BluetoothDevice> devices = myBluetoothAdapter.getBondedDevices(); // 獲取所有已經(jīng)配置的設(shè)置列表
if (devices.size() == 0) {
return;
}
for(BluetoothDevice device : devices) {
String address1 = device.getAddress();
//遍歷已配對列表,上次連接的設(shè)備已配對時自動配對
if (address.equals(address1)) {
new Thread(new Runnable() {
@Override
public void run() {
connectionBluetooth(address); // 通過連接藍牙地址連接藍牙打印機
}
}).start();
}
}
}
}
/**
* 通過連接藍牙地址連接藍牙打印機
*/
private void connectionBluetooth(String addr) {
BluetoothDevice device = myBluetoothAdapter.getRemoteDevice(addr);
connectionBluetooth(device);
}
/**
* 通過藍牙設(shè)置數(shù)據(jù)連接藍牙打印機
*/
private void connectionBluetooth(BluetoothDevice device) {
connectionDevice = device;
connectedDeviceName = device.getName();
initKeZhi(address);
}
/**
* 柯芝打印機連接方式
*/
private boolean initKeZhi(String adress){
int arg = OperateInterface.STATE_NONE;
if (adress == "" || adress == null) {
showBlueStat(getResources().getString(R.string.notSelectPrinter));
return false;
}
BluetoothDevice myDevice;
if (myBluetoothAdapter == null) {
showBlueStat(getResources().getString(R.string.readingBluetoothError));
return false;
}
myDevice = myBluetoothAdapter.getRemoteDevice(adress);
if (myDevice == null) {
showBlueStat(getResources().getString(R.string.readingBluetoothError));
return false;
}
arg = OperateInterface.STATE_CONNECTING;
myHandler.obtainMessage(OperateInterface.MESSAGE_STATE_CHANGE, arg, 0).sendToTarget();
if(zpSDK.connect(adress))
{
blueConnectResult = true;
arg = OperateInterface.STATE_CONNECTED;
}else {
blueConnectResult = false;
showBlueStat(getResources().getString(R.string.connectError));
arg = OperateInterface.STATE_NONE;
myHandler.obtainMessage(OperateInterface.MESSAGE_STATE_CHANGE, arg, 0).sendToTarget();
return false;
}
myHandler.obtainMessage(OperateInterface.MESSAGE_STATE_CHANGE, arg, 0).sendToTarget();
return true;
}莱衩、
點擊未配對時彈出選擇框
選擇配對時跳轉(zhuǎn)到系統(tǒng)藍牙配對界面
startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
選擇連接時
/**
* 彈出已配對連接列表,選擇藍牙進行連接
*/
private void selectBluetooth() {
Set<BluetoothDevice> devices = myBluetoothAdapter.getBondedDevices(); // 獲取所有已經(jīng)配置的設(shè)置列表
if (devices.size() == 0) { // 判斷已經(jīng)配對列表,如果為0則提示
Toast.makeText(this, R.string.noPairedDevices, Toast.LENGTH_LONG).show(); // 沒有已經(jīng)配對的設(shè)備
openOptionsMenu();
return;
}
final Dialog dialog = new Dialog(this); // 實例一個對話框
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // 設(shè)置對話框無標題
View view = LayoutInflater.from(this).inflate(R.layout.bluetooth_device_list, null); // 創(chuàng)建藍牙列表布局界面
ListView listView = (ListView) view.findViewById(R.id.bluetoothDeviceList); // 獲取ListView
List<BluetoothDevice> data = new ArrayList<BluetoothDevice>(); // 將已經(jīng)配對的set集合轉(zhuǎn)換成List集合
data.addAll(devices);
BluetoothDeviceAdapter adapter = new BluetoothDeviceAdapter(this, data, R.layout.bluetooth_device_item);
listView.setAdapter(adapter); // 將適配器應(yīng)用到ListView
listView.setOnItemClickListener(new OnItemClickListener() { // 注冊列表條目點擊事件
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
BluetoothDevice device = (BluetoothDevice) parent.getItemAtPosition(position);
address = device.getAddress();
connectedDeviceName = device.getName();
connectionBluetooth(device);
dialog.dismiss();
}
});
dialog.setContentView(view); // 將列表應(yīng)用到彈出框中
Window dialogWindow = dialog.getWindow(); // 獲取當前屏幕(以下為設(shè)置彈出框的屬性)
WindowManager.LayoutParams lp = dialogWindow.getAttributes(); // 獲取對話框的屬性
WindowManager windowManager = getWindowManager(); // 獲取窗口管理器
Display display = windowManager.getDefaultDisplay(); // 獲取窗口默認顯示的對象
lp.width = (int) (display.getWidth() * 0.95); // 設(shè)置對話框的屬性,寬度為當前默認屏幕的寬度的0.9
dialogWindow.setGravity(Gravity.CENTER); // 設(shè)置對話框在屏幕的水平居中
dialog.show(); // 顯示彈出框
}
最后在onDestroy()中斷開連接zpSDK.disconnect();