Android藍芽-實現主動發起連線
Android藍芽操作-主動發起連線
上次Android開發中用到了藍芽裝置,用於主動連線stm32控制的藍芽模組,這裡把它的使用方式總結出來:
目錄:
- 前言
- 操作步驟
- Android藍芽控制程式碼
- 總結
一、前言
開發環境相關引數如下:
//AndroidSdudio2.2.2
compileSdkVersion 26
buildToolsVersion "26.0.0"
minSdkVersion 19
targetSdkVersion 19
當然,高於這個版本的理論上都是沒問題的,因為沒有用到一些高版本安卓的新特性,所以老版本的也可以試試。
二、操作步驟
其實藍芽相關的基礎知識網上一搜一大把,我就不在這裡copy了,主要講講主動發起連線的相關用途與操作步驟。
用途:兩個藍芽連線後進行透明傳輸(可以理解為相當於一根資料線直接連線兩個裝置從而進行資料傳輸,忽略了藍芽裝置存在的事實以及相關實現細節)。
步驟1: 檢測當前手機藍芽是否開啟,若沒有則開啟。
步驟2:對周圍環境的藍芽進行搜尋,發現裝置則記錄起來。
步驟3:使用者選擇一個藍芽裝置進行連線。
步驟4:開始配對併發起連線。
步驟5:傳輸資料。
三、Android藍芽控制程式碼
1、檢測藍芽是否開啟:
private BluetoothAdapter mBTAdapter = null ;
mBTAdapter = BluetoothAdapter.getDefaultAdapter(); //得到一個系統預設可用的藍芽裝置物件,可以用來進行大部分藍芽操作了
if (!mBTAdapter.isEnabled()) { //如果藍芽裝置沒有開啟
mBTAdapter.enable();//申請開啟藍芽
}
2、發起搜尋
//開始搜尋裝置
private void doDiscovery(){
if(BTAdapter.isDiscovering()){
BTAdapter.cancelDiscovery();//取消搜尋
}
BTAdapter.startDiscovery();//開始搜尋
}
3、記錄裝置
//定義兩個string型別的陣列介面卡
ArrayAdapter<String> pairedListAdapter = new ArrayAdapter<String>(this.R.layout.device_name);//定義一個已連線過的裝置列表介面卡
newDeviceAdapter = new ArrayAdapter<String>(this, R.layout.device_name);//定義一個新裝置列表的介面卡
//下面三行是已連線裝置的更新與點選
ListView pairedList = (ListView)findViewById(R.id.lv_paired);
pairedList.setAdapter(pairedListAdapter);//setAdapter,執行後都會到getView方法中,用來重新整理新資料
pairedList.setOnItemClickListener(connectDeviceListener);//給已經配對了的裝置列表的每一項註冊監聽事件
//下面三行是新裝置的更新與點選
ListView newDeviceList = (ListView)findViewById(R.id.lv_newdevices);
newDeviceList.setAdapter(newDeviceAdapter);
newDeviceList.setOnItemClickListener(connectDeviceListener);
//接收系統發出的的發現新裝置廣播
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(BTReceiver,filter);//註冊廣播器監聽
//接收系統的搜尋結束了的廣播
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(BTReceiver,filter);
BTAdapter = BluetoothAdapter.getDefaultAdapter();//獲取一個BluetoothAdapter物件昂
//以下這句話加下面的if判斷句聯合實現了一個功能:獲取已配對的藍芽list並展示在pairedList裡
Set<BluetoothDevice> pairedDeviceSet = BTAdapter.getBondedDevices() ;//取得已經綁定了的藍芽裝置集合,藍芽關閉時返回值為null
if(pairedDeviceSet.size()>0){//若已經繫結過的藍芽裝置不為空
for(BluetoothDevice device:pairedDeviceSet){
String s = device.getName().toString();
pairedListAdapter.add(device.getName() + "\n" + device.getAddress());//新增入列表
}
}else{
String noDevice = "沒發現任何裝置".toString();
pairedListAdapter.add(noDevice);
}
4、選擇一個藍芽並連線
if (mBTAdapter.getState() == BluetoothAdapter.STATE_ON) {//若不加這個判斷語句,使用者拒絕開啟藍芽時會閃退
String address = destinationBluetoothAddress;
BluetoothDevice decive = mBTAdapter.getRemoteDevice(address);
mChatServer.connect(decive);
}
//注意:這裡是從另一個類擷取的上面的mChatServer.connect(decive)的具體實現:
public synchronized void connect(BluetoothDevice device) {
//取消正在連線的執行緒
if (mState == STATE_CONNECTING) {
if (mConnectThread != null) {
mConnectThread.cancel();//關閉套接字
mConnectThread = null;
}
}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
// Start the thread to connect with the given device
mConnectThread = new ConnectThread(device);
mConnectThread.start();
}
**注意:**destinationBluetoothAddress必須是一個藍芽的MAC地址字串,可以從藍芽列表獲得。
5、傳送資料
//獲得message的內容轉化為字元陣列,使用輸出流傳遞出去
private void sendMessage(String message){
if(mChatServer.getState()!= ChatServer.STATE_CONNECTED){//getstate():獲取當前藍芽的狀態:已經開啟,開啟中,已經關閉,關閉中
//sendMsgtoUI("未連線");
reConnect.setImageResource(R.drawable.top_bulutooth_unconnect2);
title.setText("藍芽燈:未連線");
return;
}
byte[] send = message.getBytes();
mChatServer.write(send);
//注意:這裡貼上mChatServer.write(send)的具體實現:
public void write(byte[] out) {
// Create temporary object
ConnectedThread r;
// Synchronize a copy of the ConnectedThread
synchronized (this) {
if (mState != STATE_CONNECTED) return;
r = mConnectedThread;
}
// Perform the write unsynchronized
r.write(out);
}
//注意:這裡將貼上 r.write(out)的具體實現:
public void write(byte[] buffer) {//將資料寫入輸出流的buffer
try {
mmOutStream.write(buffer);//mmOutStream是一個private final OutputStream mmOutStream;
} catch (IOException e) {
e.printStackTrace();
}
}
四、總結
其實程式碼只是一個簡單的思路提供,由於幾部分程式碼都封裝成了類,不同功能程式碼是放在不同的類裡面的,所以僅僅是直接複製那五步的,肯定是不能用的。但是我相信如果理解了,一定會收穫很多。
而且因為專案的目標裝置是STM32控制的藍芽模組,所以這裡直接解析為byte進行傳輸是有必要的(當然也是因為outputstream的特性)。
貼個圖:
相關推薦
Android藍芽-實現主動發起連線
Android藍芽操作-主動發起連線 上次Android開發中用到了藍芽裝置,用於主動連線stm32控制的藍芽模組,這裡把它的使用方式總結出來: 目錄: 前言 操作步驟 Android藍芽控制程式碼 總結 一、前言 開發環境相關引數如
Android藍芽實現裝置間資料傳輸
這篇文章總結通過藍芽實現兩臺pad間資料傳輸 文章基於傳統藍芽,而不是BLE。 藍芽應該是移動裝置經常用到的功能模組,Android Bluetooth API 是Android提供的用來實現點到點和多點無線功能。 使用 Bluetooth API
樹莓派2model B 通過藍芽實現A2DP協議連線手機播放音樂
使用樹莓派,開啟他的A2DP功能,實現用手機藍芽控制樹莓派播放歌曲。主要操作過程參考http://wangye.org/blog/archives/921/以及英文部落格http://www.instructables.com/id/Turn-your-Raspberry-
android藍芽串列埠連線固定Mac地址,省略搜尋過程的實現
/* 開啟多執行緒實現藍芽連線的耗時操作 */ private class ConnectThread implements Runnable { @Override public void run() { Message message = new Mes
Android中如何實現藍芽的配對與連線
7. 連線 繫結(配對)和連線是兩個不同的過程,繫結是指兩個裝置發現了對方的存在,可以獲取到對方的名稱、地址等資訊,有能力建立起連線;連線是指兩個裝置共享了一個RFCOMM通道,有能力進行資料互傳。確認繫結上了之後,才能開始連線。可以試試藍芽音箱的連線過程,就是先點選一次,開始配對,配對成功後出現在已繫
Android藍芽socket實現視訊實時傳輸,以及圖片和文字傳輸
目標 兩臺手機裝置之間能夠正常進行藍芽配對(藍芽模組兒和硬體掛鉤,所以需要兩臺真機) socket實現藍芽文字傳輸 實現圖片傳輸 實現實時視訊傳輸 程式碼下載:https://download.csdn.net/download/m0_37781149/10434336
Android藍芽搜尋連線通訊
藍芽( Bluetooth® ):是一種無線技術標準,可實現固定裝置、移動裝置和樓宇個人域網之間的短距離資料交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。藍芽技術最初由電信巨頭愛立信公司於1994年創制,當時是作為RS232資料線的替代方案。
Android 藍芽連線之 A2dp
A2DPProfile 定義了高質量音訊資料傳輸的協議和過程,包括立體聲和單聲道資料的傳輸。這裡的高質量音訊指的是單聲道(Mono)和立體聲(Sterco) 的音訊,主要區別於藍牙 SCO 鏈路上傳輸的普通語音。A2DP 的典型應用是將音樂播放器的音訊資
【更多原創參見個人小站:http://www.softlifelogging.com/】android藍芽分析_leetcode實現每週一題_藍芽基礎知識
部落格公告 本部落格所有文章均為原創,歡迎交流,歡迎轉載;轉載請勿篡改內容,並且註明出處,禁止用於商業目的,謝謝! 歡迎訪問個人小站: 隨手記生活:http://xdyang.azurewebsites.net/
[Android藍芽]三步實現藍芽聊天APP
先看下結構目錄 ChatService.java —— 藍芽連線 DeviceList.java —— 裝置顯示 MainActivity.java—— 主介面 1.許可權 要獲取藍芽功能,先在AndroidManifest.x
Android 藍芽開發之搜尋、配對、連線、通訊大全
藍芽( Bluetooth®):是一種無線技術標準,可實現固定裝置、移動裝置和樓宇個人域網之間的短距離資料交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。藍芽裝置最多可以同時和7個其它藍芽裝置建立連線,進行通訊,當然並不是每一個藍芽都可以達到
Android藍芽高階操作(多連線)
最近一直在做與bluetooth相關的應用。主要涉及Android手機藍芽的多連線問題。網上幾乎沒有與藍芽多連線相關的具體實現資料,所以我開始從android的官方文件入手,大半夜的一個人坐下面看那英文文件,真TMD不是滋味,現在回想下當年做的英語閱讀理解真似一坨sh
android 藍芽通訊實現手機藍芽的開啟,並掃描附近可見的藍芽裝置
藍芽是一種重要的短距離無線通訊協議,廣泛應用於各種裝置(手機,醫療,汽車等)。藍芽是比較常用的無線通訊裝置,早研究成為手機的標配。現在的安卓手機基本上都有藍芽,所有通過藍芽對資料有很好的硬體基礎 在Android中,與藍芽有關的類和介面在android.bluetooth包
Android藍芽4.0 關閉藍芽重開無法根據地址連線問題
在藍芽專案的末尾,在個別手機上出來,手動關閉手機藍芽,和再次啟動,開啟app發現無法連線上,經過檢視log最後確定錯誤是: onClientConnectionState()- status=133 clientIf=5 device=地址 133的一個錯誤,前面試過很
Android 藍芽獲得連線裝置的Mac地址和名稱
adapter = BluetoothAdapter.getDefaultAdapter(); int a2dp = adapter.getProfileConnectionState(BluetoothProfile.A2DP); int headset = adap
Android 藍芽4.0實現,自動匹配藍芽裝置
今天開始寫部落格來記錄我的工作學習成長,作為一個初學者,近期的一個工作是通過Android藍芽4.0來實現與藍芽裝置的資料交換,下面就通過程式碼和文字來解釋一下整個過程。 首先我要說明的是,我再專案中使用了一個開源庫,我覺得不錯,所有程式碼都
Android藍芽開發【六】hfp連線
本文主要內容是藍芽手機音訊的連線、斷開流程分析,對應藍芽HFP profile。 該文章是基於Android原始碼4.3的 1 hfp簡單介紹 HFP (Hands-free Profile),讓藍芽裝置(如藍芽耳機)可以控制電話,如接聽、結束通話、拒接、語音撥號等,
Android 藍芽技術 帶你實現終端間資料傳輸
藍芽技術在智慧硬體方面有很多用武之地,今天我就為大家分享一下藍芽在Android系統下的使用方法技巧,並實現一下兩個終端間資料的傳輸。 藍芽(Bluetooth)是一種短距離的無線通訊技術標準,藍芽協議分為4層,即核心協議層、電纜替代協議層、電話控制協議層和採納的其它
用Android手機通過藍芽模組HC-06連線Arduino串列埠輸出
通過手機進行通訊是可以實現很多遙控功能,雖然距離是比較短,一般是10米,但對於我這種新手做測試,比起買一個幾百塊的多通道遙控器成本要低很多。實驗目的:用Android實現藍芽連線通過Arduino串列埠輸出資訊這次使用的是藍芽HC-06從模組,就是從機模組,這都因為買之前沒有
Android-經典藍芽(BT)-建立長連線傳輸短訊息和檔案
一.藍芽模組簡介 從藍芽4.0開始包含兩個藍芽晶片模組:傳統/經典藍芽模組(Classic Bluetooth,簡稱BT)和低功耗藍芽(Bluetooth Low Energy,簡稱BLE) 經典藍芽是在之前的藍芽1.0,1.2,2.0+E