android 傳統藍牙開發 (附示例源碼)

Linux編程

點擊右側關注,免費入門到精通!

作者QiaoJim

http://blog.csdn.net/qiao_jim/article/details/73008695

最近學習了android傳統藍牙,自己整理了一下思路,然後寫了一個BluetoothStudy小測試程序,來運用所理解的android傳統藍牙開發技術,寫下

一些心得和思路,供其他android熱愛者參考,也方便日後回顧。

博客如有錯誤之處,歡迎留言之處,十分感謝。博客最後會附上源碼,可下載借鑒。

一、整體思路和對應相關方法

1、獲得BluetoothAdapter:BluetoothAdapter.getDefaultAdapter();

2、打開藍牙:詢問用戶打開(推薦)或直接bluetoothAdapter.enable();

3、查詢已綁定設備,發現新設備:bluetoothAdapter.getBondedDevices();bluetoothAdapter.startDiscovery();

4.1、服務端,一直監聽請求,當該端主動發出請求時,關閉該端的監聽,角色轉為客戶端:

bluetoothDevice.createRfcommSocketToServiceRecord(UUID);

4.2、客戶端,點擊目標設備,配對連接:

bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, UUID);

5、通過BluetoothSocket通信:IO流讀寫

二、開發詳解

1、聲明權限,注意可能需要的運行時權限

<uses-permissionandroid:name="android.permission.BLUETOOTH"/><uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/><uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>

android 6.0以上設備發現新藍牙時,需加入運行時權限,否則無法監聽ACTION_FOUND廣播

if(Build.VERSION.SDK_INT>=6.0){ActivityCompat.requestPermissions(getActivity(),newString[]{Manifest.permission.ACCESS_FINE_LOCATION},Params.MY_PERMISSION_REQUEST_CONSTANT);}publicvoidonRequestPermissionsResult(intrequestCode,Stringpermissions[],int[]grantResults){switch(requestCode){caseParams.MY_PERMISSION_REQUEST_CONSTANT:{if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){//運行時權限已授權}return;}}}

2、打開藍牙,推薦用對話框形式讓用戶打開

bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();//藍牙未打開,詢問打開if(!bluetoothAdapter.isEnabled()){IntentturnOnBtIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(turnOnBtIntent,Params.REQUEST_ENABLE_BT);}@OverridepublicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){switch(requestCode){caseParams.REQUEST_ENABLE_BT:{//用戶打開藍牙if(resultCode==RESULT_OK){//顯示已綁定藍牙設備showBondDevice();}break;}caseParams.REQUEST_ENABLE_VISIBILITY:{//設置該藍牙設備可被其他設備發現,600是設置的設備可發現時間(博客最後有簡單說明)if(resultCode==600){toast("藍牙已設置可見");}elseif(resultCode==RESULT_CANCELED){toast("藍牙設置可見失敗,請重試");}break;}}}

3、通過BluetoothAdapter獲取已綁定的藍牙設備

privatevoidshowBondDevice(){deviceList.clear();//所有已綁定設備,一個Set集合Set<BluetoothDevice>tmp=bluetoothAdapter.getBondedDevices();for(BluetoothDeviced:tmp){deviceList.add(d);}//更新列表listAdapter.notifyDataSetChanged();}

4、發現藍牙設備,發現一個設備,會發送一條ACTION_FOUND廣播,註冊廣播接收器,可獲得對應藍牙設備信息

bluetoothAdapter.startDiscovery();intentFilter=newIntentFilter();btReceiver=newMyBtReceiver();//監聽搜尋開始,搜尋結束,發現新設備3條廣播intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);intentFilter.addAction(BluetoothDevice.ACTION_FOUND);getActivity().registerReceiver(btReceiver,intentFilter);

//廣播接收器privateclassMyBtReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){toast("開始搜尋...");}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){toast("搜尋結束");}elseif(BluetoothDevice.ACTION_FOUND.equals(action)){//獲得發現的設備BluetoothDevicedevice=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if(device.getBondState()!=BluetoothDevice.BOND_BONDED){deviceList.add(device);listAdapter.notifyDataSetChanged();}}}}

5、設備連接,服務器端開啟線程一直等待連接,客戶端點擊某個目標設備,關閉服務器線程監聽,並開啟線程,發出連接請求。

注意:客戶端連接前,一定cancelDiscovery()

//藍牙已開啟if(bluetoothAdapter.isEnabled()){showBondDevice();//默認開啟服務線程監聽if(serverThread!=null){serverThread.cancel();}serverThread=newServerThread(bluetoothAdapter,uiHandler);newThread(serverThread).start();}listView.setOnItemClickListener(newAdapterView.OnItemClickListener(){@OverridepublicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){//關閉服務器監聽if(serverThread!=null){serverThread.cancel();serverThread=null;}BluetoothDevicedevice=deviceList.get(position);//開啟客戶端線程,連接點擊的遠程設備clientThread=newClientThread(bluetoothAdapter,device,uiHandler);newThread(clientThread).start();//通知ui連接的服務器端設備Messagemessage=newMessage();message.what=Params.MSG_CONNECT_TO_SERVER;message.obj=device;uiHandler.sendMessage(message);}});

6、建立BluetoothSocket連接以後,使用IO流數據傳輸,服務器和客戶端讀寫數據類似,貼一部分代碼供參考

publicvoidwriteData(StringdataSend){if(serverThread!=null){serverThread.write(dataSend);}elseif(clientThread!=null){clientThread.write(dataSend);}}

//寫數據publicvoidwrite(Stringdata){try{out.write(data.getBytes("utf-8"));}catch(IOExceptione){e.printStackTrace();}}

newThread(newRunnable(){@Overridepublicvoidrun(){byte[]buffer=newbyte[1024];intlen;Stringcontent;try{//讀數據while((len=in.read(buffer))!=-1){content=newString(buffer,0,len);Messagemessage=newMessage();message.what=Params.MSG_CLIENT_REV_NEW;message.obj=content;//更新uiuiHandler.sendMessage(message);}}catch(IOExceptione){e.printStackTrace();}}}).start();

7、其他說明

(1)新設備綁定,bluetoothDevice.createBond()

(2)設置設備可被發現的時間:

IntentenableIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);enableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,600);startActivityForResult(enableIntent,Params.REQUEST_ENABLE_VISIBILITY);

(3)服務器獲得遠端設備,bluetoothSocket.getRemoteDevice()

(4)通過MAC獲得藍牙設備,bluetoothAdapter.getRemoteDevice(String address)

(5)關閉藍牙,bluetoothAdapter.disable()

三、源碼示例下載

附上源碼github地址

https://github.com/QiaoJim/BluetoothStudy

感謝閱讀,如有錯誤,請留言。

四、效果圖

推薦↓↓↓

?16個技術公眾號】都在這里!

涵蓋:工程師大咖、源碼共讀、工程師共讀、數據結構與算法、黑客技術和網路安全、大數據科技、編程前端、Java、Python、Web編程開發、Android、iOS開發、Linux、數據庫研發、幽默工程師等。

分享到Facebook

 


不知道如何找適合的對象?歡迎加官方LINE → Line ID:@shesay
戀愛小秘書免費一對一諮詢!
✔追蹤我的YouTube:https://www.youtube.com/@datenami
✔追蹤我的TikTok:https://www.tiktok.com/@datnami

 

配對成功的關鍵:參加實體交友活動

erose主題派對與戀愛小秘書創辦人娜米表示:「透過各種有趣的實體活動,不僅能親眼真實見到異性,也能在活動進行中讓大家很輕鬆自然的認識彼此、聊天互動,能更快速的找到適合的對象。」

結合大數據用心篩選 + 客製化條件配對

戀愛小秘書團隊已經成功替4000位以上的未婚男女配對成功,這個驚人成果背後的秘密在於「高度客製化服務」,跟每位客戶深度訪談,瞭解客戶真正的特質及需求,從「契合度」提高速配率。

訪談結果結合專屬的人格分析測驗與數據配對分析,精緻化的操作,締造高速配率!

除此之外,戀愛小秘書團隊還會定期追蹤客戶的後續狀況,目的是希望協助客戶發展長期且穩定的伴侶關係。

實名認證防造假!隱私保護最安心!

採用「實名認證」的制度,不僅是把關顧客的身份,避免已婚人士或動機不單純者的加入,更對客戶資料嚴格保密,讓客戶們能在安全且有隱私的狀況下認識另一半。

多元有趣的主題活動,豐富你的社交生活

戀愛小秘書團隊每個月都會規劃豐富多元的實體活動,從戶外踏青、娛樂遊戲、手作、料理課程到桌遊活動,希望客戶們能從歡樂的氣氛中認識彼此。

透過實體活動讓大家先有初步的接觸,然後再為會員們做「客製化」的約會安排。

另外針對想提升自身魅力的客戶,也有投資理財、形象穿搭等講座可供選擇。

追求脫單,先勇敢跨出你的第一步

許多單身者為了心中理想的對象條件,在還沒認識新朋友時,就先限制了自己。建議以認識新朋友的心態,積極參與活動,並適當的設限,才能真正為自己帶來戀愛的機會!勇敢跨出第一步吧!

♡ 現在就和戀愛小秘書娜米聊聊吧Line ID:@shesay

♡ 追蹤娜米的臉書粉絲團

她來報好康

 

SheSay 專注在 兩性、愛情等領域
建立專屬女生觀點的品牌形象
堅持「在第一時間掌握男女的時事議題」
將時下最流行的話題網羅、呈現。

馬上測算你的戀愛密碼

戀愛小秘書-娜米

單身很久?一直被分手?
從生日就看出你的戀愛疑難雜症!
娜米的戀愛數字密碼來幫你了。