您好,登錄后才能下訂單哦!
這篇文章主要介紹“Android藍牙的開啟和搜索設備功能怎么開發”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Android藍牙的開啟和搜索設備功能怎么開發”文章能幫助大家解決問題。
Android 平臺包含藍牙網絡堆棧支持,此支持能讓設備以無線方式與其他藍牙設備交換數據。應用框架提供通過 Android Bluetooth API 訪問藍牙功能的權限。這些 API 允許應用以無線方式連接到其他藍牙設備,從而實現點到點和多點無線功能。
Android 應用可通過 Bluetooth API 執行以下操作:
掃描其他藍牙設備
查詢本地藍牙適配器的配對藍牙設備
建立 RFCOMM 通道
通過服務發現連接到其他設備
與其他設備進行雙向數據傳輸
管理多個連接
本文重點介紹傳統藍牙。傳統藍牙適用于較為耗電的操作,其中包括 Android 設備之間的流式傳輸和通信等。針對具有低功耗要求的藍牙設備,Android 4.3(API 級別 18)中引入了面向低功耗藍牙的 API 支持。
為了讓支持藍牙的設備能夠在彼此之間傳輸數據,它們必須先通過配對過程形成通信通道。其中一臺設備(可檢測到的設備)需將自身設置為可接收傳入的連接請求。另一臺設備會使用服務發現過程找到此可檢測到的設備。在可檢測到的設備接受配對請求后,這兩臺設備會完成綁定過程,并在此期間交換安全密鑰。二者會緩存這些密鑰,以供日后使用。完成配對和綁定過程后,兩臺設備會交換信息。當會話完成時,發起配對請求的設備會發布已將其鏈接到可檢測設備的通道。但是,這兩臺設備仍保持綁定狀態,因此在未來的會話期間,只要二者在彼此的范圍內且均未移除綁定,便可自動重新連接。
如要在應用中使用藍牙功能,必須聲明兩個權限。第一個是 BLUETOOTH
。需要此權限才能執行任何藍牙通信,例如請求連接、接受連接和傳輸數據等。
第二個必須聲明的權限是 ACCESS_FINE_LOCATION
。應用需要此權限,因為藍牙掃描可用于收集用戶的位置信息。此類信息可能來自用戶自己的設備,以及在商店和交通設施等位置使用的藍牙信標。
注意:如果應用適配 Android 9(API 級別 28)或更低版本,則可以聲明 ACCESS_COARSE_LOCATION
權限而非 ACCESS_FINE_LOCATION
權限。
如果想讓應用啟動設備發現或操縱藍牙設置,則除了 BLUETOOTH
權限以外,還必須聲明 BLUETOOTH_ADMIN
權限。大多數應用只是需利用此權限發現本地藍牙設備。除非應用是根據用戶請求修改藍牙設置的“超級管理員”,否則不應使用此權限所授予的其他功能。
在應用清單文件中聲明藍牙權限。例如:
<manifest ... > <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- If your app targets Android 9 or lower, you can declare ACCESS_COARSE_LOCATION instead. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ... </manifest>
需驗證設備支持藍牙,確保在此情況下啟用該功能,這樣你的應用才能通過藍牙進行通信。
如果設備不支持藍牙,則應正常停用任何藍牙功能。如果設備支持藍牙但已停用此功能,則可以請求用戶在不離開應用的同時啟用藍牙。借助 BluetoothAdapter
,可以分兩步完成此設置:
獲取 BluetoothAdapter
所有藍牙 Activity
都需要 BluetoothAdapter
。如要獲取 BluetoothAdapter
,請調用靜態的 getDefaultAdapter()
方法。此方法會返回一個 BluetoothAdapter
對象,表示設備自身的藍牙適配器(藍牙無線裝置)。整個系統只有一個藍牙適配器,并且應用可使用此對象與之進行交互。如果 getDefaultAdapter()
返回 null
,則表示設備不支持藍牙。例如:
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { // Device doesn't support Bluetooth }
啟用藍牙下一步,需要確保已啟用藍牙。調用 isEnabled()
,以檢查當前是否已啟用藍牙。如果此方法返回 false
,則表示藍牙處于停用狀態。如要請求啟用藍牙,請調用 startActivityForResult()
,從而傳入一個 ACTION_REQUEST_ENABLE
Intent 操作。此調用會發出通過系統設置啟用藍牙的請求(無需停止應用)。例如:
private static final int REQUEST_ENABLE_BT = 10; if (!bluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_ENABLE_BT && resultCode == RESULT_OK) { Log.e(TAG, "onActivityResult: enable bluetooth!!!!!!"); } }
如圖所示,系統將顯示對話框,請求用戶允許啟用藍牙。如果用戶響應“Yes”,系統會開始啟用藍牙,并在該進程完成(或失敗)后將焦點返回應用。
傳遞給 startActivityForResult()
的 REQUEST_ENABLE_BT
常量為局部定義的整型數(必須大于 0)。系統會以 onActivityResult()
實現中的 requestCode
參數形式,傳回該常量。
如果成功啟用藍牙,Activity
會在 onActivityResult()
回調中收到 RESULT_OK
結果代碼。如果由于某個錯誤(或用戶響應“No”)未成功啟用藍牙,則結果代碼為 RESULT_CANCELED
。
你的應用還可選擇偵聽 ACTION_STATE_CHANGED
廣播 Intent,每當藍牙狀態發生變化時,系統都會廣播此 Intent。此廣播包含額外字段 EXTRA_STATE 和 EXTRA_PREVIOUS_STATE
,二者分別包含新的和舊的藍牙狀態。這些額外字段可能為以下值:STATE_TURNING_ON
、STATE_ON
、STATE_TURNING_OFF
和 STATE_OFF
。如果你的應用需檢測對藍牙狀態所做的運行時更改,請偵聽此廣播。
注意:啟用可檢測性即可自動啟用藍牙。如果你計劃在執行藍牙 Activity 之前一直啟用設備的可檢測性。
利用 BluetoothAdapter
,你可以通過設備發現或查詢配對設備的列表來查找遠程藍牙設備。
設備發現是一個掃描過程,它會搜索局部區域內已啟用藍牙功能的設備,并請求與每臺設備相關的某些信息。此過程有時也被稱為發現、查詢或掃描。但是,只有在當下接受信息請求時,附近區域的藍牙設備才會通過啟用可檢測性響應發現請求。如果設備已啟用可檢測性,它會通過共享一些信息(例如設備的名稱、類及其唯一的 MAC 地址)來響應發現請求。借助此類信息,執行發現過程的設備可選擇發起對已檢測到設備的連接。
在首次與遠程設備建立連接后,系統會自動向用戶顯示配對請求。當設備完成配對后,系統會保存關于該設備的基本信息(例如設備的名稱、類和 MAC 地址),并且可使用 Bluetooth API 讀取這些信息。借助遠程設備的已知 MAC 地址,你可以隨時向其發起連接,而無需執行發現操作(假定該設備仍處于有效范圍內)。
請注意,被配對與被連接之間存在區別:
被配對是指兩臺設備知曉彼此的存在,具有可用于身份驗證的共享鏈路密鑰,并且能夠與彼此建立加密連接。被連接是指設備當前共享一個 RFCOMM
通道,并且能夠向彼此傳輸數據。當前的 Android Bluetooth API 要求規定,只有先對設備進行配對,然后才能建立 RFCOMM
連接。在使用 Bluetooth API 發起加密連接時,系統會自動執行配對。
以下部分介紹如何查找已配對的設備,或使用設備發現功能來發現新設備。
注意:Android 設備默認處于不可檢測到狀態。用戶可通過系統設置將設備設為在有限的時間內處于可檢測到狀態,或者,應用可請求用戶在不離開應用的同時啟用可檢測性。
在執行設備發現之前,必須查詢已配對的設備集,以了解所需的設備是否處于已檢測到狀態。為此,請調用 getBondedDevices()
。此方法會返回一組表示已配對設備的 BluetoothDevice 對象。例如,可以查詢所有已配對設備,并獲取每臺設備的名稱和 MAC 地址,如以下代碼段所示:
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); if (pairedDevices.size() > 0) { // There are paired devices. Get the name and address of each paired device. for (BluetoothDevice device : pairedDevices) { String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); // MAC address } }
注意:執行設備發現將消耗藍牙適配器的大量資源。在找到要連接的設備后,請務必使用 cancelDiscovery()
停止發現,然后再嘗試連接。此外,不應在連接到設備的情況下執行設備發現,因為發現過程會大幅減少可供任何現有連接使用的帶寬。
如要開始發現設備,只需調用 startDiscovery()
。該進程為異步操作,并且會返回一個布爾值,指示發現進程是否已成功啟動。發現進程通常包含約 12 秒鐘的查詢掃描,隨后會對發現的每臺設備進行頁面掃描,以檢索其藍牙名稱。
應用必須針對 ACTION_FOUND
Intent 注冊一個 BroadcastReceiver
,以便接收每臺發現的設備的相關信息。系統會為每臺設備廣播此 Intent。Intent 包含額外字段 EXTRA_DEVICE
和 EXTRA_CLASS
,二者又分別包含 BluetoothDevice
和 BluetoothClass
。以下代碼段展示如何在發現設備時通過注冊來處理廣播:
@Override protected void onCreate(Bundle savedInstanceState) { ... // Register for broadcasts when a device is discovered. IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(receiver, filter); Button btnSearch = findViewById(R.id.btn_search); btnSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //開始搜索 bluetoothAdapter.startDiscovery(); } }); } // Create a BroadcastReceiver for ACTION_FOUND. private final BroadcastReceiver receiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Discovery has found a device. Get the BluetoothDevice // object and its info from the Intent. BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); // MAC address } } }; @Override protected void onDestroy() { super.onDestroy(); ... // Don't forget to unregister the ACTION_FOUND receiver. unregisterReceiver(receiver); }
如果希望將本地設備設為可被其他設備檢測到,請使用 ACTION_REQUEST_DISCOVERABLE
Intent 調用 startActivityForResult(Intent, int)
。這樣便可發出啟用系統可檢測到模式的請求,從而無需導航至設置應用,避免暫停使用你的應用。默認情況下,設備處于可檢測到模式的時間為 120 秒(2 分鐘)。通過添加 EXTRA_DISCOVERABLE_DURATION
Extra
屬性,你可以定義不同的持續時間,最高可達 3600 秒(1 小時)。
以下代碼段將設備處于可檢測到模式的時間設置為 5 分鐘(300 秒):
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent);
如圖所示,系統將顯示對話框,請求用戶允許將設備設為可檢測到模式。如果用戶響應“Yes”,則設備會變為可檢測到模式,并在指定時間內保持該模式。然后,你的 Activity 將會收到對 onActivityResult()
回調的調用,其結果代碼等于設備可檢測到的持續時間。如果用戶響應“No”或出現錯誤,則結果代碼為 RESULT_CANCELED
。
注意:如果尚未在設備上啟用藍牙,則啟用設備可檢測性會自動啟用藍牙。
設備將在分配的時間內以靜默方式保持可檢測到模式。如果希望在可檢測到模式發生變化時收到通知,則可以為 ACTION_SCAN_MODE_CHANGED
Intent 注冊 BroadcastReceiver
。此 Intent 將包含額外字段 EXTRA_SCAN_MODE
和 EXTRA_PREVIOUS_SCAN_MODE
,二者分別提供新的和舊的掃描模式。每個 Extra
屬性可能擁有以下值:
SCAN_MODE_CONNECTABLE_DISCOVERABLE
:設備處于可檢測到模式。
SCAN_MODE_CONNECTABLE
:設備未處于可檢測到模式,但仍能收到連接。
SCAN_MODE_NONE
:設備未處于可檢測到模式,且無法收到連接。
關于“Android藍牙的開啟和搜索設備功能怎么開發”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。