這里先奉上google的官方開(kāi)發(fā)文檔具练,因?yàn)楸疚哪壳八婕暗降拇蟛糠种R(shí)點(diǎn)都是從這篇文章中學(xué)到的,同時(shí)也強(qiáng)烈建議看到這篇文章的你甜无,能夠抽空看看這篇文檔:https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html
藍(lán)牙開(kāi)發(fā)從無(wú)到有:
藍(lán)牙開(kāi)發(fā)分為兩種扛点,一種是傳統(tǒng)藍(lán)牙開(kāi)發(fā)哥遮,耗電量比較大。另一種是android4.3中引入的低功耗藍(lán)牙開(kāi)發(fā)陵究。無(wú)論是哪一種眠饮,都要從無(wú)到有,從少到多的漸進(jìn)開(kāi)發(fā)铜邮。本文主要介紹通過(guò)在android.bluetooth包下的api的幫助下仪召,通過(guò)設(shè)置藍(lán)牙,查找藍(lán)牙設(shè)備松蒜,連接設(shè)備扔茅,以及在設(shè)備間傳輸數(shù)據(jù),來(lái)實(shí)現(xiàn)一個(gè)類(lèi)似于客戶端服務(wù)器這樣的一個(gè)Demo秸苗。
需求:
擁有兩臺(tái)android手機(jī)召娜,安裝app,按照操作提示惊楼,一臺(tái)選擇服務(wù)器玖瘸,一臺(tái)選擇客戶端,客戶端通過(guò)藍(lán)牙連接服務(wù)器檀咙,并在按下發(fā)送按鈕的時(shí)候雅倒,將用戶填寫(xiě)在EditText中的信息,發(fā)送到服務(wù)器弧可。服務(wù)器接受并顯示在屏幕上屯断。
一:權(quán)限
如果我們想使用藍(lán)牙開(kāi)發(fā),那么以下的這兩個(gè)權(quán)限一定要在Manifest中申請(qǐng)侣诺。
“android.permission.BLUETOOTH”
"android.permission.BLUETOOTH_ADMIN"
第一個(gè)權(quán)限是用來(lái)請(qǐng)求藍(lán)牙連接,傳輸數(shù)據(jù)氧秘。第二個(gè)權(quán)限用來(lái)啟動(dòng)設(shè)備發(fā)現(xiàn)和操作藍(lán)牙設(shè)置年鸳。
二:設(shè)置藍(lán)牙
1:藍(lán)牙入口,要從android.bluetooth包中的BluetoothAdapter說(shuō)起丸相。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時(shí)弛作,如果為null涕蜂,很不幸,你的手機(jī)不支持藍(lán)牙映琳。否則就可以通過(guò)下面這段代碼判斷并開(kāi)啟藍(lán)牙机隙。其中isEnabled是用來(lái)判斷藍(lán)牙是否已經(jīng)開(kāi)啟蜘拉。開(kāi)啟藍(lán)牙,是通過(guò)系統(tǒng)的intent來(lái)實(shí)現(xiàn)有鹿。intent通過(guò)設(shè)置一個(gè)名為BluetoothAdapter.ACTION_REQUEST_ENABLE的action旭旭,將會(huì)打開(kāi)system activity,而在這個(gè)system activity中葱跋,將會(huì)提示用戶應(yīng)用將會(huì)開(kāi)始藍(lán)牙持寄,是否開(kāi)啟。如果允許開(kāi)啟娱俺,就會(huì)返回RESLUT_OK稍味,如果拒絕或者其他錯(cuò)誤就返回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è)備仲闽,這是一個(gè)藍(lán)牙掃描的過(guò)程,需要注意三點(diǎn):
(1):當(dāng)我們配對(duì)傳遞數(shù)據(jù)時(shí)僵朗,一定要記住關(guān)閉查找赖欣。因?yàn)閽呙璨檎沂且粋€(gè)很費(fèi)資源的過(guò)程,如果在傳遞數(shù)據(jù)時(shí)開(kāi)啟验庙,可能會(huì)導(dǎo)致傳遞失敗顶吮。
(2):藍(lán)牙設(shè)備僅在其當(dāng)前已啟用可檢查性時(shí)才會(huì)響應(yīng)發(fā)現(xiàn)請(qǐng)求,當(dāng)我們的設(shè)備發(fā)現(xiàn)其他的設(shè)備時(shí)粪薛,會(huì)收到被發(fā)現(xiàn)設(shè)備等mac地址悴了,設(shè)備名稱等。這些信息保存在android.bluetooth包下的BluetoothDevice中违寿。
(3):建立首次設(shè)備連接湃交,將會(huì)自動(dòng)顯示配對(duì)請(qǐng)求。配對(duì)完成后藤巢,信息將會(huì)被系統(tǒng)保存搞莺,下次可以直接通過(guò)mac地址實(shí)現(xiàn)連接。
4:配對(duì)設(shè)備掂咒,通過(guò)調(diào)用BluetoothAdapter中國(guó)年的getBondedDevices()方法才沧,可以獲取到已配對(duì)的藍(lán)牙設(shè)備。如果目標(biāo)設(shè)備已存在在列表中绍刮,那么我們可以直接通過(guò)此來(lái)執(zhí)行連接操作温圆。如果目標(biāo)設(shè)別沒(méi)有在已配對(duì)的藍(lán)牙設(shè)備中,需要調(diào)用BluetoothAdapter中的startDiscovery()方法來(lái)發(fā)現(xiàn)設(shè)備孩革。當(dāng)我們連接設(shè)備時(shí)岁歉,需要調(diào)用
mBluetoothAdapter.cancelDiscovery()
關(guān)閉發(fā)現(xiàn)操作。
5:啟用可檢測(cè)性嫉戚,前面已經(jīng)提到刨裆,只有當(dāng)設(shè)備啟動(dòng)可檢測(cè)性澈圈,才能被其他設(shè)備檢測(cè)到》校可檢測(cè)性有一個(gè)持續(xù)時(shí)間瞬女,這個(gè)持續(xù)時(shí)間在android sdk 25版本中,和谷歌官方文檔中有出入:
當(dāng)用戶允許設(shè)備設(shè)為可檢測(cè)到時(shí)努潘,返回的成功結(jié)果碼是設(shè)置的持續(xù)時(shí)間诽偷,拒絕和錯(cuò)誤是RESULT_CANCELED
6:連接設(shè)備
服務(wù)器和客戶端分別以不同的方法獲得BluetoothSocket。通過(guò)分別獲得到的BluetoothSocket疯坤,服務(wù)端可以從中讀取客戶端發(fā)過(guò)來(lái)的數(shù)據(jù)报慕,客戶端可以通過(guò)其寫(xiě)入數(shù)據(jù)。
(1)客戶端獲得BluetoothSocket關(guān)鍵代碼
//device 當(dāng)客戶端通過(guò)startDiscovery() 掃描設(shè)備压怠,并且在廣播中接受到手機(jī)掃描到的設(shè)備眠冈,
//或者是通過(guò)getBondedDevices()得到了已經(jīng)保存的設(shè)備時(shí),都可以獲得BluetoothDevice.
//MY_UUID 是通過(guò)網(wǎng)絡(luò)任意uuid生成器生成的字符串菌瘫,然后通過(guò)UUID.fromString(string)得到蜗顽。
//這個(gè)MY_UUID需要服務(wù)端與客戶端保持一致。
BluetoothSocket mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
(2) 服務(wù)端貨的BluetoothSocket關(guān)鍵代碼
//Name 可以是任意字符串雨让,當(dāng)然也可以是包名
BluetoothServerSocket tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
項(xiàng)目地址:
https://github.com/fengfutong/BluetoothS2C
您能讀到這里雇盖,對(duì)我已是莫大鼓勵(lì),點(diǎn)個(gè)喜歡栖忠,請(qǐng)勿打賞####