詳細解析BluetoothAdapter的詳細api

jopen 10年前發布 | 195K 次閱讀 Android開發 移動開發 BluetoothAdapter

這篇文章將會詳細解析BluetoothAdapter的詳細api, 包括隱藏方法, 每個常量含義. 


一 BluetoothAdapter簡介


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秒;


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!