對於一般的軟體開發人員來說,藍芽是很少用到的,尤其是
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);
ANDROID 登入的那點事
登入的時候給使用者很好的響應,廢話不多說上 並註明自己留意的tips mpassfield edittext findviewbyid r.id.password muserfield edittext findviewbyid r.id.username mloginbutton button f...
Android藍芽開發
藍芽開發,也就那麼幾個操作,開啟 搜尋 配對 連線 通訊。其他的東西都是建立在這麼幾個之上。下面就來說說這幾個基本操作。使用前,首先加入藍芽的兩個基本許可權。然後他們基本圍繞這麼幾個類來用。這些類是什麼,慢慢來說。bluetoothadapter bluetoothadapter bluetooth...
安卓開發那點事
不知不覺,開發android已經有一年,不算那些零零散散的時光,也寫了足足四個多月 了。要問我有什麼感想,也就那樣吧,沒啥想法,做應用開發,難免都有難度的。一路跌跌撞撞走來,暈頭轉向的不知所思所想,走過許多的彎路。其實最實際的還是要有紮實的基礎作鋪墊,關鍵點就 是要刻苦鑽研,知識儲備要豐富。所謂那些...