這里先奉上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版本中,和谷歌官方文檔中有出入:


當(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)個喜歡,請勿打賞####