對於一般的軟體開發人員來說,藍芽是很少用到的,尤其是
android
的藍芽開發,國內的例子很少
android
對於藍芽開發從
2.0版本的
sdk才開始支援,而且模擬器不支援,測試至少需要兩部手機,所以制約了很多技術人員的開發,剛巧這段時間公司有藍芽開發的需求,我看了很多國內、國外的資料,又研究了一下
j2me
的藍芽開發(為了找找思路),雖然我想要的功能還沒實現(我曾經在很多論壇裡問了很多遍,苦於沒有高人解答
..),我要實現的功能是連線乙個硬體裝置,凡是跟硬體沾上邊的,都讓軟體人員開發頭疼..
好了,廢話不說了,鑑於很多開發人員現在也有藍芽開發的需求,也為了大家少走些彎路,先將我積攢的一點點在android藍芽開發經驗與大家分享一下!
首先,要操作藍芽,先要在androidmanifest.xml裡加入許可權
然後,看下api,
android
所有關於藍芽開發的類都在android.bluetooth包下,如下圖,只有8個類
而我們需要用到了就只有幾個而已:
1.bluetoothadapter
顧名思義,藍芽介面卡,直到我們建立bluetoothsocket連線之前,都要不斷操作它
bluetoothadapter
裡的方法很多,常用的有以下幾個:
canceldiscovery()
disable()
關閉藍芽
enable()
開啟藍芽,這個方法開啟藍芽不會彈出提示,更多的時候我們需要問下使用者是否開啟,一下這兩行**同樣是開啟藍芽,不過會提示使用者:
intemtenabler=new intent(bluetoothadapter.action_request_enable);
startactivityforresult(enabler,recode);//
同startactivity(enabler);
getaddress()
獲取本地藍芽位址
getdefaultadapter()
獲取預設bluetoothadapter,實際上,也只有這一種方法獲取bluetoothadapter
getname()
獲取本地藍芽名稱
getremotedevice(string address)
根據藍芽位址獲取遠端藍芽裝置
getstate()
獲取本地藍芽介面卡當前狀態(感覺可能除錯的時候更需要)
isdiscovering()
判斷當前是否正在查詢裝置,是返回true
isenabled()
判斷藍芽是否開啟,已開啟返回true,否則,返回false
listenusingrfcommwithservicerecord(string name,uuid uuid)
根據名稱,uuid建立並返回bluetoothserversocket,這是建立bluetoothsocket伺服器端的第一步
startdiscovery()
開始搜尋,這是搜尋的第一步
2.bluetoothdevice
看名字就知道,這個類描述了乙個藍芽裝置
createrfcommsockettoservicerecord(uuiduuid)
根據uuid建立並返回乙個bluetoothsocket
這個方法也是我們獲取bluetoothdevice的目的——建立bluetoothsocket
這個類其他的方法,如getaddress(),getname(),同bluetoothadapter
3.bluetoothserversocket
如果去除了bluetooth相信大家一定再熟悉不過了,既然是socket,方法就應該都差不多,
這個類一種只有三個方法
兩個過載的accept(),accept(inttimeout)兩者的區別在於後面的方法指定了過時時間,需要注意的是,執行這兩個方法的時候,直到接收到了客戶端的請求(或是過期之後),都會阻塞執行緒,應該放在新執行緒裡執行!
還有一點需要注意的是,這兩個方法都返回乙個bluetoothsocket,最後的連線也是伺服器端與客戶端的兩個bluetoothsocket的連線
close()
這個就不用說了吧,翻譯一下——關閉!
4.bluetoothsocket,
跟bluetoothserversocket相對,是客戶端
一共5個方法,不出意外,都會用到
close(),
關閉connect()
連線getinptustream()
獲取輸入流
getoutputstream()
獲取輸出流
getremotedevice()
獲取遠端裝置,這裡指的是獲取bluetoothsocket指定連線的那個遠端藍芽裝置
1、獲取本地藍芽介面卡
bluetoothadapter
madapter= bluetoothadapter.getdefaultadapter();
2、開啟藍芽
if(!madapter.isenabled())
3、搜尋裝置
1)剛才說過了madapter.startdiscovery()
是第一步,可以你會發現沒有返回的藍芽裝置,怎麼知道查詢到了呢?向下看,不要急
2)定義broadcastreceiver,關於broadcastreceiver不多講了,不是今天的討論內容,**如下
broadcastreceiver mreceiver = new broadcastreceiver() }
//搜尋完成
else if (bluetoothadapter.action_discovery_finished
.equals(action)) }
//執行更新列表的** }
};這樣,沒當查詢到新裝置或是搜尋完成,相應的操作都在上段**的兩個if裡執行了,不過前提是你要先註冊
broadcastreceiver
,具體**如下
intentfilter filter = new intentfilter(bluetoothdevice.action_found);
registerreceiver(mreceiver, filter);
filter = new intentfilter(bluetoothadapter.action_discovery_finished);
registerreceiver(mreceiver, filter);
(這段**,一般寫在oncreate()裡..)
3建立連線,首先android sdk(2.0以上版本)支援的藍芽連線是通過bluetoothsocket建立連線(說的不對請高人指正),伺服器端(bluetoothserversocket)和客戶端(bluetoothsocket)需指定同樣的uuid,才能建立連線,因為建立連線的方法會阻塞執行緒,所以伺服器端和客戶端都應啟動新執行緒連線
1)伺服器端:
//uuid
格式一般是"******xx-***x-***x-***x-************"可到
// 申請bluetoothserversocket serversocket = madapter. listenusingrfcommwithservicerecord(serversocketname,uuid);
serversocket.accept();
2)客戶端:
//還記得我們剛才在broadcastreceiver獲取了bluetoothdevice麼?
bluetoothsocket cliensocket=dcvice. createrfcommsockettoservicerecord(uuid);
cliensocket.connect();
4、資料傳遞,通過以上操作,就已經建立的bluetoothsocket連線了,資料傳遞無非是通過流的形式
1)獲取流
inputstream = socket.getinputstream();
outputstream = socket.getoutputstream();
2)寫出、讀入
這是基礎的東西,在這就不多贅述了
終於寫完了,這是我這兩天的學習經驗,希望對有藍芽需求的朋友有所幫助!另外,之前我們提過
android.bluetooth
下有8個類,還有4個類沒有用到,那4個類裡定義的都是常量,我也沒用到它們..
最後把我找到的幾個藍芽的例子附在後面,希望從事軟體開發,尤其是android開發的朋友以後多溝通、多分享!
補充一下,使裝置能夠被搜尋
intent enabler = new intent(bluetoothadapter.action_request_discoverable);
startactivityforresult(enabler,request_discoverable);
安卓開發筆記 藍芽開發
一般情況下用預設的藍芽介面卡就好了 private static bluetoothadapter adapter bluetoothadapter.getdefaultadapter 貼幾個常用的方法 開啟藍芽功能 public static void openbluetooth 關閉藍芽功能 p...
關於安卓藍芽開發總結
這幾個星期提出了乙個小專案,於是和團隊日夜加工,大概就是感測器連線51微控制器,51再通過藍芽傳送資訊到手機端。前幾天一直在研究微控制器裡面的程式,這幾天是負責寫安卓客戶端接收的介面,涉及到有關安卓藍芽的開發,仔細學習了下,略有心得,做個總結,新手感悟,望大神指點。注意,這個主要是和微控制器藍芽相連...
安卓 android 開發相關
color red 安卓開發步驟 color 3 更新android的sdk,此時可能需要修改host檔案,讓安卓能找到sdk 4 編寫安卓 並在vdm中測試 5 若要把生成的apk放到真機中測試,還裡要對apk進行打包簽名 color red android sdk 更新失敗,需要修改host檔案...