android開發(fā):與藍(lán)牙的第一次接觸

這里先奉上google的官方開發(fā)文檔,因為本文目前所涉及到的大部分知識點(diǎn)都是從這篇文章中學(xué)到的,同時也強(qiáng)烈建議看到這篇文章的你,能夠抽空看看這篇文檔:https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html


藍(lán)牙開發(fā)從無到有:

藍(lán)牙開發(fā)分為兩種,一種是傳統(tǒng)藍(lán)牙開發(fā),耗電量比較大。另一種是android4.3中引入的低功耗藍(lán)牙開發(fā)。無論是哪一種,都要從無到有,從少到多的漸進(jìn)開發(fā)。本文主要介紹通過在android.bluetooth包下的api的幫助下,通過設(shè)置藍(lán)牙,查找藍(lán)牙設(shè)備,連接設(shè)備,以及在設(shè)備間傳輸數(shù)據(jù),來實現(xiàn)一個類似于客戶端服務(wù)器這樣的一個Demo。

需求:

擁有兩臺android手機(jī),安裝app,按照操作提示,一臺選擇服務(wù)器,一臺選擇客戶端,客戶端通過藍(lán)牙連接服務(wù)器,并在按下發(fā)送按鈕的時候,將用戶填寫在EditText中的信息,發(fā)送到服務(wù)器。服務(wù)器接受并顯示在屏幕上。

一:權(quán)限

如果我們想使用藍(lán)牙開發(fā),那么以下的這兩個權(quán)限一定要在Manifest中申請。

“android.permission.BLUETOOTH”
"android.permission.BLUETOOTH_ADMIN"

第一個權(quán)限是用來請求藍(lán)牙連接,傳輸數(shù)據(jù)。第二個權(quán)限用來啟動設(shè)備發(fā)現(xiàn)和操作藍(lán)牙設(shè)置。

二:設(shè)置藍(lán)牙

1:藍(lán)牙入口,要從android.bluetooth包中的BluetoothAdapter說起。BluetoothAdapter是所有藍(lán)牙交互的入口點(diǎn)。利用它可以發(fā)現(xiàn),查詢藍(lán)牙設(shè)備。那么如何獲取到BluetoothAdapter呢?有兩種方法:

//第一種
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//第二種 需要api 18以上才可以
BluetoothManager bluetoothManager= (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();

2:啟用藍(lán)牙,當(dāng)我們拿到bluetoothAdapter不為null時,如果為null,很不幸,你的手機(jī)不支持藍(lán)牙。否則就可以通過下面這段代碼判斷并開啟藍(lán)牙。其中isEnabled是用來判斷藍(lán)牙是否已經(jīng)開啟。開啟藍(lán)牙,是通過系統(tǒng)的intent來實現(xiàn)。intent通過設(shè)置一個名為BluetoothAdapter.ACTION_REQUEST_ENABLE的action,將會打開system activity,而在這個system activity中,將會提示用戶應(yīng)用將會開始藍(lán)牙,是否開啟。如果允許開啟,就會返回RESLUT_OK,如果拒絕或者其他錯誤就返回RESULT_CANCELED。

private final int REQUEST_ENABLE_BLUETOOTH=201;
if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BLUETOOTH);
}

3:查找設(shè)備,這是一個藍(lán)牙掃描的過程,需要注意三點(diǎn):
(1):當(dāng)我們配對傳遞數(shù)據(jù)時,一定要記住關(guān)閉查找。因為掃描查找是一個很費(fèi)資源的過程,如果在傳遞數(shù)據(jù)時開啟,可能會導(dǎo)致傳遞失敗。
(2):藍(lán)牙設(shè)備僅在其當(dāng)前已啟用可檢查性時才會響應(yīng)發(fā)現(xiàn)請求,當(dāng)我們的設(shè)備發(fā)現(xiàn)其他的設(shè)備時,會收到被發(fā)現(xiàn)設(shè)備等mac地址,設(shè)備名稱等。這些信息保存在android.bluetooth包下的BluetoothDevice中。
(3):建立首次設(shè)備連接,將會自動顯示配對請求。配對完成后,信息將會被系統(tǒng)保存,下次可以直接通過mac地址實現(xiàn)連接。

4:配對設(shè)備,通過調(diào)用BluetoothAdapter中國年的getBondedDevices()方法,可以獲取到已配對的藍(lán)牙設(shè)備。如果目標(biāo)設(shè)備已存在在列表中,那么我們可以直接通過此來執(zhí)行連接操作。如果目標(biāo)設(shè)別沒有在已配對的藍(lán)牙設(shè)備中,需要調(diào)用BluetoothAdapter中的startDiscovery()方法來發(fā)現(xiàn)設(shè)備。當(dāng)我們連接設(shè)備時,需要調(diào)用

mBluetoothAdapter.cancelDiscovery()

關(guān)閉發(fā)現(xiàn)操作。

5:啟用可檢測性,前面已經(jīng)提到,只有當(dāng)設(shè)備啟動可檢測性,才能被其他設(shè)備檢測到??蓹z測性有一個持續(xù)時間,這個持續(xù)時間在android sdk 25版本中,和谷歌官方文檔中有出入:

谷歌官方文檔.png

sdk 25.png

當(dāng)用戶允許設(shè)備設(shè)為可檢測到時,返回的成功結(jié)果碼是設(shè)置的持續(xù)時間,拒絕和錯誤是RESULT_CANCELED

6:連接設(shè)備
服務(wù)器和客戶端分別以不同的方法獲得BluetoothSocket。通過分別獲得到的BluetoothSocket,服務(wù)端可以從中讀取客戶端發(fā)過來的數(shù)據(jù),客戶端可以通過其寫入數(shù)據(jù)。
(1)客戶端獲得BluetoothSocket關(guān)鍵代碼

//device 當(dāng)客戶端通過startDiscovery() 掃描設(shè)備,并且在廣播中接受到手機(jī)掃描到的設(shè)備,
//或者是通過getBondedDevices()得到了已經(jīng)保存的設(shè)備時,都可以獲得BluetoothDevice.
//MY_UUID 是通過網(wǎng)絡(luò)任意uuid生成器生成的字符串,然后通過UUID.fromString(string)得到。
//這個MY_UUID需要服務(wù)端與客戶端保持一致。
BluetoothSocket mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);

(2) 服務(wù)端貨的BluetoothSocket關(guān)鍵代碼

//Name 可以是任意字符串,當(dāng)然也可以是包名
 BluetoothServerSocket   tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
項目地址:

https://github.com/fengfutong/BluetoothS2C

您能讀到這里,對我已是莫大鼓勵,點(diǎn)個喜歡,請勿打賞####

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容