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

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

谷歌官方文檔.png

sdk 25.png

當(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)勿打賞####

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崔挖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庵寞,更是在濱河造成了極大的恐慌狸相,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捐川,死亡現(xiàn)場(chǎng)離奇詭異卷哩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)属拾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冷溶,“玉大人渐白,你說(shuō)我怎么就攤上這事〕哑担” “怎么了纯衍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)苗胀。 經(jīng)常有香客問(wèn)我襟诸,道長(zhǎng)瓦堵,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任歌亲,我火速辦了婚禮菇用,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陷揪。我一直安慰自己惋鸥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布悍缠。 她就那樣靜靜地躺著卦绣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飞蚓。 梳的紋絲不亂的頭發(fā)上滤港,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音趴拧,去河邊找鬼溅漾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛八堡,可吹牛的內(nèi)容都是我干的樟凄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼兄渺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缝龄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起挂谍,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叔壤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后口叙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體炼绘,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年妄田,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俺亮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疟呐,死狀恐怖脚曾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情启具,我是刑警寧澤本讥,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響拷沸,放射性物質(zhì)發(fā)生泄漏色查。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一撞芍、第九天 我趴在偏房一處隱蔽的房頂上張望秧了。 院中可真熱鬧,春花似錦勤庐、人聲如沸示惊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)米罚。三九已至,卻和暖如春丈探,著一層夾襖步出監(jiān)牢的瞬間录择,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工碗降, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隘竭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓讼渊,卻偏偏與公主長(zhǎng)得像动看,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爪幻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容