詳細解析BluetoothAdapter

一 BluetoothAdapter簡介android


1.繼承關係服務器

該類僅繼承了Object類;ui


2.該類做用對象


BluetoothAdapter表明了移動設備的本地的藍牙適配器, 經過該藍牙適配器能夠對藍牙進行基本操做, 例如 : 啓動設備發現(startDiscovery), 獲取已配對設備(getBoundedDevices), 經過mac藍牙地址獲取藍牙設備(getRemoteDevice), 從其它設備建立一個監聽鏈接(listenUsingRfcommWithServiceRecord);繼承




BluetoothAdapter.getDefaultAdapter()該靜態方法能夠獲取該適配器對象.資源




3.藍牙權限字符串

Android.permission.BLUETOOTH : 容許程序鏈接到已配對的藍牙設備, 請求鏈接/接收鏈接/傳輸數據須要改權限, 主要用於對配對後進行操做;get


android.permission.BLUETOOTH_ADMIN : 容許程序發現和配對藍牙設備, 該權限用來管理藍牙設備, 有了這個權限, 應用才能使用本機的藍牙設備, 主要用於對配對前的操做;it


優先級 : BLUETOOTH權限是BLUETOOTH_ADMIN權限的前提, 若是沒有BLUETOOTH權限, 就不能使用BLUETOOTH_ADMIN權限;io




二 API詳解


1.常量介紹


(1)開關狀態值

藍牙關閉 : int STATE_OFF , 值爲10, 藍牙模塊處於關閉狀態;


藍牙打開中 : int STATE_TURNING_ON , 值爲11, 藍牙模塊正在打開;


藍牙開啓 : int STATE_ON , 值爲12, 藍牙模塊處於開啓狀態;


藍牙開啓中 : int STATE_TURNING_OFF , 值爲13, 藍牙模塊正在關閉;


藍牙開關狀態順序 : STATE_OFF --> STATE_TURNING_ON --> STATE_ON --> STATE_TURNING_OFF --> STATE_OFF;




(2)掃描狀態值

無功能狀態 : int SCAN_MODE_NONE , 值爲20, 查詢掃描和頁面掃描都失效, 該狀態下藍牙模塊既不能掃描其它設備, 也不可見;


掃描狀態 : int SCAN_MODE_CONNECTABLE , 值爲21, 查詢掃描失效, 頁面掃描有效, 該狀態下藍牙模塊能夠掃描其它設備, 從可見性來講只對已配對的藍牙設備可見, 只有配對的設備才能主動鏈接本設備;


可見狀態 : int SCAN_MODE_CONNECTABLE_DISCOVERABLE, 值爲23, 查詢掃描和頁面掃描都有效;




查詢掃描功能 : 其它設備能夠掃描到本設備 , 指的是可見性可見;


頁面掃描功能 : 能夠主動掃描其它設備;




(3)藍牙操做接收的廣播

開始搜索廣播 : String ACTION_DISCOVERY_STARTED, 藍牙適配器開始搜索遠程設備, 值爲"android.bluetooth.action.DISCOVERY_START", 藍牙適配器開始搜索以後, 會先有12秒的查詢掃描(12s內可見), 查詢掃描後進行頁面掃描(主動搜索), 須要BLUETOOTH權限;


若是搜索到藍牙設備, 就會收到BluetoothDevice.ACTION_FOUND廣播, 能夠從Intent中獲取存放在其中的BluetoothDevice對象, intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);


設備查找很是消耗資源, 在查找的過程當中, 不能鏈接遠程的藍牙設備, 已經存在的鏈接也要限制帶寬, 若是想要執行除查找外的其它操做, 以前最好調用cancelDiscovery();




搜索完成廣播 : String ACTION_DISCOVERY_FINISHED,藍牙S適配器完成搜索發出的廣播, 值爲"android.bluetooth.adapter.action.DISCOVERY_FINISHED", 須要BLUETOOTH權限;




藍牙名稱改變廣播 : String ACTION_LOCAL_NAME_CHANGED, 本地的藍牙適配器改變了本身的名稱, 值爲"android.bluetooth.adapter.action.LOCAL_NAME_CHANGED", 注意改變的是本設備名稱, 不是遠程設備的.這個廣播包含一個EXTRA_LOCAL_NAME附加域, 須要BLUETOOTH權限;




掃描模式變化廣播 : String ACTION_SCAN_MODE_CHANGED, 藍牙模塊掃描模式發生了變化, 值爲"android.bluetooth.adapter.action.SCAN_MODE_CHANGED", 該Intent對象包含了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE, 兩個附加域分別是新的和舊的掃描模式, 這裏能夠根據先後掃描模式的不一樣作出不一樣的操做, 須要BLUETOOTH權限;




開關模式變化廣播 : String ACTION_STATE_CHANGED, 藍牙模塊被打開或者關閉, 值爲"android.bluetooth.adapter.action.STATE_CHANGED", 該廣播的Intent中包含EXTRA_STATE和EXTRA_PREVIOUS_STATE兩個附加域, 須要BLUETOOTH權限;




(4)藍牙操做請求的廣播

開啓藍牙 : String ACTION_REQUEST_ENABLE, 打開藍牙, 值爲"android.bluetooth.adapter.action.REQUEST_ENABLE", 


1

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

2

startActivityForResult(intent, requestCode);能夠在Activity中的onActivityResult()方法中處理結果, 若是藍牙模塊打開成功, 則返回結果嗎RESULT_OK; 若是藍牙模塊打開失敗, 則返回結果碼RESULT_CANCELED;

打開和關閉藍牙模塊, 均可以經過ACTION_STATE_CHANGED廣播來監聽;




藍牙可見 : String ACTION_REQUEST_DISCOVERABLE, 使藍牙可見, 值爲"android.bluetooth.adapter.action.REQUEST_DISCOVERABLE", 默認的可見時間爲120s, 能夠在廣播中添加附加域, 設置任意的可見時間, 附加域爲EXTRA_DISCOVERABLE_DURATION, 須要BLUETOOTH權限;

能夠在Activity中的onActivityResult()方法中處理結果, 若是藍牙模塊設置可見成功, 則返回結果嗎RESULT_OK; 若是藍牙模塊設置可見失敗, 則返回結果碼RESULT_CANCELED;


1

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

2

discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);

3

startActivityForResult(discoverableIntent,resultCode)


(5)附加域

附加域是放在Intent中的, 使用Intent.putExtra(附加域,附加值)方法添加附加域;


掃描模式附加域 : 這兩個附加域的值是掃描模式, 能夠爲SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE;


String EXTRA_SCAN_MODE : 值爲"android.bluetooth.adapter.extra.SCAN_MODE";


String EXTRA_PREVIOUS_SCAN_MODE : 值爲"android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE";




開關狀態附加域 : 這兩個附加域的值是開關狀態, 能夠爲STATE_OFF, STATE_ON, STATE_TURNING_OFF, STATE_TURNING_ON;


String EXTRA_STATE : 值爲"android.bluetooth.adapter.extra.STATE";


String EXTRA_PREVIOUS_STATE : 值爲"android.bluetooth.adapter.extra.PREVIOUS_STATE";




藍牙名稱附加域 : String EXTRA_LOCAL_NAME , 存放ACTION_LOCAL_NAME_CHANGED附加域的附加值 , 值爲"android.bluetooth.adapter.extra.LOCAL_NAME";




可見時間附加域 : String EXTRA_DISCOVERABLE_DURATION, 存放的是ACTION_REQUEST_DISCOVERABLE廣播的可見時長, 值爲"android.bluetooth.adapter.extra.DISCOVERABLE_DURATION";




(6)錯誤碼

int ERROR , 這個值用來標記錯誤 , 方便本身使用的 , 沒有實際意義;




2.State狀態相關方法



(1)獲取藍牙適配器

1

public static sychronized BluetoothAdapter getDefaultAdapter();

返回值 : 本地藍牙適配器 BluetoothAdapter對象;




(2)獲取state狀態方法

1

public int getState();

做用 : 獲取是否可用


返回值 : 返回當前的State狀態值, STATE_ON, STATE_OFF, STATE_TURNING_ON, STATE_TURNING_OFF;


權限 : BLUETOOTH;




(3)藍牙是否可用

1

public boolean isEnable();

做用 : 獲取當前設備藍牙模塊是否可用;


返回值 : 返回當前藍牙模塊是否可用, true 可用, false 不可用;


權限 : BLUETOOTH權限;




(4)打開藍牙

1

public boolean enable();

做用 : 打開本地藍牙適配器;


返回值 : 若是打開成功則返回true, 若是打開失敗返回false;


權限 : BLUETOOTH_ADMIN權限;




(5)關閉藍牙

1

public boolean disable();

做用 : 關閉本地設備藍牙;


返回值 : 若是關閉藍牙成功, 返回true; 若是關閉藍牙失敗, 返回false;


權限 : BLUETOOTH_ADMIN權限;




3. 掃描相關方法



(1)開始掃描

1

public boolean startDiscovery();

做用 : 開始查找遠程藍牙設備, 先進行12秒的查詢掃描(被動可見), 以後進行頁面掃描(主動搜索); 搜索過成功不能嘗試對遠程設備的鏈接, 同時已鏈接的設備的帶寬也會被壓縮, 等待時間變長; 使用cancelDiscovery()能夠終止搜索;


返回值 : 若是成功則返回true, 失敗返回false;


權限 : 

 BLUETOOTH_ADMIN權限;




(2)是否在掃描中

1

public boolean isDiscovering();

做用 : 是否正在搜索;


返回值 : 若是設備正在搜索, 返回true; 若是設備沒有進行藍牙搜索, 返回false;


權限 : BLUETOOTH權限;




(3)取消查找

1

public boolean cancelDiscovery();

做用 : 取消藍牙搜索; 在進行connect()方法的時候, 必須調用這個方法, 藍牙搜索是一個服務進行, 在搜索中的時候, 不能進行鏈接;


返回值 : 若是取消成功, 則返回true; 若是取消失敗, 返回false;


 




(4)獲取掃描模式

1

public int getScanMode();

做用 : 獲取當前藍牙的掃描模式;


返回值 : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;




 


4.與藍牙設備相關的方法

(1)檢查藍牙地址

1

public boolean checkBluetoothAddress(String address);

做用 : 檢查藍牙地址是否合法, 藍牙地址字母必須大寫, 例如 : "00:43:A8:23:10:F0";


參數 : 17位的字符串, 例如 : "00:43:A8:23:10:F0";


返回值 : 若是藍牙地址合法返回true, 反之返回false;




(2)獲取本地藍牙地址

1

public String getAddress();

做用 : 返回本地藍牙的MAC地址;


返回值 : 本地的硬件地址;




(3)獲取本地藍牙名稱

1

public String getName();

返回值 : 本地藍牙設備的名稱;




(4)獲取綁定的藍牙集合

1

public Set<BluetoothDevice> getBoundedDevices();

做用 : 獲取已經配對的藍牙設備的集合, 若是藍牙未被打開, 則返回null;


 


(5)獲取遠程藍牙設備

1

public BluetoothDevice getRemoteDevice(String address);

做用 : 根據藍牙的物理地址獲取遠程的藍牙設備, 若是地址不合法, 就會產生異常;


返回值 : 獲取到的BluetoothDevice對象;




(6)建立監聽

1

publicBluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);

做用 : 建立一個監聽Rfcommon端口的藍牙監聽, 使用accept()方法監聽, 並獲取BluetoothSocket對象; 該系統會根據一個服務名稱(name)和惟一的識別碼(uuid)來建立一個SDP服務, 遠程藍牙設備能夠根據惟一的UUID來鏈接這個SDP服務器;


參數 : name : SDP服務器名稱, UUID, SDP記錄下的UUID;


返回值 : 正在監聽藍牙端口;


權限 : BLUETOOTH;




 


三 經常使用用法

 


1.打開藍牙

01

    //第一種打開方法: 調用enable 便可 

02

booleanresult = mBluetoothAdapter.enable(); 

03

   

04

// 

05

/第二種打開方法 ,調用系統API去打開藍牙 

06

if(!mBluetoothAdapter.isEnabled()) //未打開藍牙,才須要打開藍牙 

07

08

Intent intent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 

09

startActivityForResult(intent, REQUEST_OPEN_BT_CODE); 

10

//會以Dialog樣式顯示一個Activity , 咱們能夠在onActivityResult()方法去處理返回值 

11

}第一種方法打開藍牙, 沒有任何提示, 直接就打開了;

第二種方法發送廣播, 會彈出一個對話框, 選擇是否打開藍牙, 選擇是藍牙纔打開;




2.設置可見

1

private void setDiscoverable() {

2

    Intent bluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

3

    bluetoothIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600);

4

    mContext.startActivity(bluetoothIntent);

5

}

發送ACTION_REQUEST_DISCOVERABLE廣播, 同時在EXTRA_DISCOVERABLE_DURATION附加域中加入可見時間, 單位是秒;

發送這個廣播, 會彈出一個對話框, 顯示是否可見3600秒;

相關文章
相關標籤/搜索