藍牙的使用

1.繼承關係

該類僅繼承了Object類;

2.該類作用

BluetoothAdapter代表了移動設備的本地的藍牙適配器, 通過該藍牙適配器可以對藍牙進行基本操作, 例如 : 啓動設備發現(startDiscovery), 獲取已配對設備(getBoundedDevices), 通過mac藍牙地址獲取藍牙設備(getRemoteDevice), 從其它設備創建一個監聽連接(listenUsingRfcommWithServiceRecord);

BluetoothAdapter.getDefaultAdapter()該靜態方法可以獲取該適配器對象.

3.藍牙權限

android.permission.BLUETOOTH : 允許程序連接到已配對的藍牙設備, 請求連接/接收連接/傳輸數據需要改權限, 主要用於對配對後進行操作;

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

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

二 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", 

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
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;

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
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)獲取藍牙適配器

public static sychronized BluetoothAdapter getDefaultAdapter();

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

(2)獲取state狀態方法

public int getState();

作用 : 獲取是否可用

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

權限 : BLUETOOTH;

(3)藍牙是否可用

public boolean isEnable();

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

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

權限 : BLUETOOTH權限;

(4)打開藍牙

public boolean enable();

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

返回值 : 如果打開成功則返回true, 如果打開失敗返回false;

權限 : BLUETOOTH_ADMIN權限;

(5)關閉藍牙

public boolean disable();

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

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

權限 : BLUETOOTH_ADMIN權限;

3. 掃描相關方法

(1)開始掃描

public boolean startDiscovery();

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

返回值 : 如果成功則返回true, 失敗返回false;

權限 :   BLUETOOTH_ADMIN權限;

(2)是否在掃描中

public boolean isDiscovering();

作用 : 是否正在搜索;

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

權限 : BLUETOOTH權限;

(3)取消查找

public boolean cancelDiscovery();

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

返回值 : 如果取消成功, 則返回true; 如果取消失敗, 返回false;

(4)獲取掃描模式

public int getScanMode();

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

返回值 : SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_DISCOVERABLE;

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

(1)檢查藍牙地址

public boolean checkBluetoothAddress(String address);

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

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

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

(2)獲取本地藍牙地址

public String getAddress();

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

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

(3)獲取本地藍牙名稱

public String getName();

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

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

public Set<BluetoothDevice> getBoundedDevices();

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

(5)獲取遠程藍牙設備

public BluetoothDevice getRemoteDevice(String address);

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

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

(6)創建監聽

public BluetoothServerSocket listenUsingRfcommonWithServiceRecord(String name, UUID uuid);

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

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

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

權限 : BLUETOOTH;

三 常用用法

1.打開藍牙

        //第一種打開方法: 調用enable 即可  
	boolean result = mBluetoothAdapter.enable();  
	  
	//  
	/第二種打開方法 ,調用系統API去打開藍牙  
	if (!mBluetoothAdapter.isEnabled()) //未打開藍牙,才需要打開藍牙  
	{  
	Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  
	startActivityForResult(intent, REQUEST_OPEN_BT_CODE);  
	//會以Dialog樣式顯示一個Activity , 我們可以在onActivityResult()方法去處理返回值  
	}  
第一種方法打開藍牙, 沒有任何提示, 直接就打開了;

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

2.設置可見

   	private void setDiscoverable() {
   		Intent bluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
   		bluetoothIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600);
   		mContext.startActivity(bluetoothIntent);
   	}

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章