1. 如何使用android藍牙開發
Android平台支持藍牙網路協議棧,實現藍牙設備之間數據的無線傳輸。本文檔描述了怎樣利用android平台提供的藍牙API去實現藍壓設備之間的通信。藍牙具有point-to-point 和 multipoint兩種連接功能。
使用藍牙API,可以做到:
* 搜索藍牙設備
* 從本地的Bluetooth adapter中查詢已經配對的設備
* 建立RFCOMM通道
* 通過service discovery連接到其它設備
* 在設備之間傳輸數據
* 管理多個連接
基礎知識
本文檔介紹了如何使用Android的藍牙API來完成的四個必要的主要任務,使用藍牙進行設備通信,主要包含四個部分:藍牙設置、搜索設備(配對的或可見的)、連接、傳輸數據。
所有的藍牙API在android.bluetooth包中。實現這些功能主要需要下面這幾個類和介面:
BluetoothAdapter
代表本地藍牙適配器(藍牙發射器),是所有藍牙交互的入口。通過它可以搜索其它藍牙設備,查詢已經配對的設備列表,通過已知的MAC地址創建BluetoothDevice,創建BluetoothServerSocket監聽來自其它設備的通信。
BluetoothDevice
代表了一個遠端的藍牙設備, 使用它請求遠端藍牙設備連接或者獲取 遠端藍牙設備的名稱、地址、種類和綁定狀態。 (其信息是封裝在 bluetoothsocket 中) 。
BluetoothSocket
代表了一個藍牙套接字的介面(類似於 tcp 中的套接字) ,他是應用程 序通過輸入、輸出流與其他藍牙設備通信的連接點。
BluetoothServerSocket
代表打開服務連接來監聽可能到來的連接請求 (屬於 server 端) , 為了連接兩個藍牙設備必須有一個設備作為伺服器打開一個服務套接字。 當遠端設備發起連 接連接請求的時候,並且已經連接到了的時候,Blueboothserversocket 類將會返回一個 bluetoothsocket。
BluetoothClass
描述了一個設備的特性(profile)或該設備上的藍牙大致可以提供哪些服務(service),但不可信。比如,設備是一個電話、計算機或手持設備;設備可以提供audio/telephony服務等。可以用它來進行一些UI上的提示。
BluetoothProfile
BluetoothHeadset
提供手機使用藍牙耳機的支持。這既包括藍牙耳機和免提(V1.5)模式。
BluetoothA2dp
定義高品質的音頻,可以從一個設備傳輸到另一個藍牙連接。 「A2DP的」代表高級音頻分配模式。
BluetoothHealth
代表了醫療設備配置代理控制的藍牙服務
BluetoothHealthCallback
一個抽象類,使用實現BluetoothHealth回調。你必須擴展這個類並實現回調方法接收更新應用程序的注冊狀態和藍牙通道狀態的變化。
2. 如何使用Android藍牙開發
轉載 Android平台支持藍牙網路協議棧,實現藍牙設備之間數據的無線傳輸。本文檔描述了怎樣利用android平台提供的藍牙API去實現藍壓設備之間的通信。藍牙具有point-to-point 和 multipoint兩種連接功能。
使用藍牙API,可以做到:
* 搜索藍牙設備
* 從本地的Bluetooth adapter中查詢已經配對的設備
* 建立RFCOMM通道
* 通過service discovery連接到其它設備
* 在設備之間傳輸數據
* 管理多個連接
基礎知識
本文檔介紹了如何使用Android的藍牙API來完成的四個必要的主要任務,使用藍牙進行設備通信,主要包含四個部分:藍牙設置、搜索設備(配對的或可見的)、連接、傳輸數據。
所有的藍牙API在android.bluetooth包中。實現這些功能主要需要下面這幾個類和介面:
BluetoothAdapter
代表本地藍牙適配器(藍牙發射器),是所有藍牙交互的入口。通過它可以搜索其它藍牙設備,查詢已經配對的設備列表,通過已知的MAC地址創建BluetoothDevice,創建BluetoothServerSocket監聽來自其它設備的通信。
BluetoothDevice
代表了一個遠端的藍牙設備, 使用它請求遠端藍牙設備連接或者獲取 遠端藍牙設備的名稱、地址、種類和綁定狀態。 (其信息是封裝在 bluetoothsocket 中) 。
BluetoothSocket
代表了一個藍牙套接字的介面(類似於 tcp 中的套接字) ,他是應用程 序通過輸入、輸出流與其他藍牙設備通信的連接點。
BluetoothServerSocket
代表打開服務連接來監聽可能到來的連接請求 (屬於 server 端) , 為了連接兩個藍牙設備必須有一個設備作為伺服器打開一個服務套接字。 當遠端設備發起連 接連接請求的時候,並且已經連接到了的時候,Blueboothserversocket 類將會返回一個 bluetoothsocket。
BluetoothClass
描述了一個設備的特性(profile)或該設備上的藍牙大致可以提供哪些服務(service),但不可信。比如,設備是一個電話、計算機或手持設備;設備可以提供audio/telephony服務等。可以用它來進行一些UI上的提示。
BluetoothProfile
BluetoothHeadset
提供手機使用藍牙耳機的支持。這既包括藍牙耳機和免提(V1.5)模式。
BluetoothA2dp
定義高品質的音頻,可以從一個設備傳輸到另一個藍牙連接。 「A2DP的」代表高級音頻分配模式。
BluetoothHealth
代表了醫療設備配置代理控制的藍牙服務
BluetoothHealthCallback
一個抽象類,使用實現BluetoothHealth回調。你必須擴展這個類並實現回調方法接收更新應用程序的注冊狀態和藍牙通道狀態的變化。
代表一個應用程序的配置,藍牙醫療第三方應用注冊與遠程藍牙醫療設備交流。
BluetoothProfile.ServiceListener
當他們已經連接到或從服務斷開時通知BluetoothProfile IPX的客戶時一個介面(即運行一個特定的配置文件,內部服務)。
藍牙許可權
為了在你的應用中使用藍牙功能,至少要在AndroidManifest.xml中聲明兩個許可權:BLUETOOTH(任何藍牙相關API都要使用這個許可權) 和 BLUETOOTH_ADMIN(設備搜索、藍牙設置等)。
為了執行藍牙通信,例如連接請求,接收連接和傳送數據都必須有BLUETOOTH許可權。
必須要求BLUETOOTH_ADMIN的許可權來啟動設備發現或操縱藍牙設置。大多數應用程序都需要這個許可權能力,發現當地的藍牙設備。此許可權授予其他的能力不應該使用,除非應用程序是一個「電源管理」,將根據用戶要求修改的藍牙設置
注釋:要請求BLUETOOTH_ADMIN的話,必須要先有BLUETOOTH。
在你的應用manifest 文件中聲明藍牙許可權。例如:
<manifest ... >
<uses-permission android:name="android.permission.BLUETOOTH" />
...
</manifest>
通過查看<uses-permission>資料來聲明應用許可權獲取更多的信息。
藍牙設置
在你的應用通過藍牙進行通信之前,你需要確認設備是否支持藍牙,如果支持,確信它被打開。
如果不支持,則不能使用藍牙功能。如果支持藍牙,但不能夠使用,你剛要在你的應用中請求使用藍牙。這個要兩步完成,使用BluetoothAdapter。
1.獲取BluetoothAdapter
所有的藍牙活動請求BluetoothAdapter,為了獲取BluetoothAdapter,呼叫靜態方法getDefaultAdapter() 。這個會返回一個BluetoothAdapter,代表設備自己的藍牙適配器(藍牙無線電)。這個藍牙適配器應用於整個系統中,你的應用可以通過這個對象進行交互。如果getDefaultAdapter()返回null,則這個設備不支持藍牙。例如:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
}
2.打開藍牙
其次。你需要確定藍牙能夠使用。通過isEnabled()來檢查藍牙當前是否可用。如果這個方法返回false,則藍牙不能夠使用。為了請求藍牙使用,呼叫startActivityForResult()與的ACTION_REQUEST_ENABLE動作意圖。通過系統設置中啟用藍牙將發出一個請求(不停止藍牙應用)。例如:
if (mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
![http://developer.android.com/images/bt_enable_request.png]
對話框中顯示請求使用藍牙許可權。如果響應"Yes",這個進程完成(或失敗)後你的應用將能夠使用藍牙。
REQUEST_ENABLE_BT常量作為一個整型傳到startActivityForResult()中(值必須大於0),該系統傳回給你,在你onActivityResult()作為實現的requestCode參數。
如果調用藍牙成功,你的Activity就會在onActivityResult()中收到RESULT_OK結果,如果藍牙不能使用由於錯誤(或用戶響應「NO」那麼結果返回RESULT_CANCELED。
除了通過onActivityResult(),還可以通過監聽ACTION_STATE_CHANGED這個broadcast Intent來知道藍牙狀態是否改變。這個Intent包含EXTRA_STATE,EXTRA_PREVIOUS_STATE兩個欄位,分別代表新舊狀態。可能的值是STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF, 還有STATE_OFF。
小貼: Enabling discoverability 將自動啟用藍牙。如果您計劃執行藍牙活動之前,始終使設備可發現,你可以跳過上面的步驟2。參閱enabling discoverability。
搜索設備
使用BluetoothAdapter可以通過設備搜索或查詢配對設備找到遠程Bluetooth設備。
Device discovery(設備搜索)是一個掃描搜索本地已使能Bluetooth設備並且從搜索到的設備請求一些信息的過程(有時候會收到類似「discovering」,「inquiring」或「scanning」)。但是,搜索到的本地Bluetooth設備只有在打開被發現功能後才會響應一個discovery請求,響應的信息包括設備名,類,唯一的MAC地址。發起搜尋的設備可以使用這些信息來初始化跟被發現的設備的連接。
一旦與遠程設備的第一次連接被建立,一個pairing請求就會自動提交給用戶。如果設備已配對,配對設備的基本信息(名稱,類,MAC地址)就被保存下來了,能夠使用Bluetooth API來讀取這些信息。使用已知的遠程設備的MAC地址,連接可以在任何時候初始化而不必先完成搜索(當然這是假設遠程設備是在可連接的空間范圍內)。
需要記住,配對和連接是兩個不同的概念:
配對意思是兩個設備相互意識到對方的存在,共享一個用來鑒別身份的鏈路鍵(link-key),能夠與對方建立一個加密的連接。
連接意思是兩個設備現在共享一個RFCOMM信道,能夠相互傳輸數據。
目前Android Bluetooth API's要求設備在建立RFCOMM信道前必須配對(配對是在使用Bluetooth API初始化一個加密連接時自動完成的)。
下面描述如何查詢已配對設備,搜索新設備。
注意:Android的電源設備默認是不能被發現的。用戶可以通過系統設置讓它在有限的時間內可以被發現,或者可以在應用程序中要求用戶使能被發現功能。
查找匹配設備
在搜索設備前,查詢配對設備看需要的設備是否已經是已經存在是很值得的,可以調用getBondedDevices()來做到,該函數會返回一個描述配對設備BluetoothDevice的結果集。例如,可以使用ArrayAdapter查詢所有配對設備然後顯示所有設備名給用戶:
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
mArrayAdapter.add(device.getName() + "n" + device.getAddress());
}
};
BluetoothDevice對象中需要用來初始化一個連接唯一需要用到的信息就是MAC地址。
3. android bluetooth已知了bluetoothDevice的mac地址 怎麼得到bluetoothDevice
使用BluetoothAdapter類提供的方法getRemoteDevice 創建BluetoothDevice實例。
提醒一句,BluetoothAdapter實例應使用 BluetoothAdapter.getDefaultAdapter ()靜態方法獲取。
以下摘譯自android文檔。
public BluetoothDevice getRemoteDevice (String address)
Since: API Level 5
Get a BluetoothDevice object for the given Bluetooth hardware address.
Valid Bluetooth hardware addresses must be upper case, in a format such as "00:11:22:33:AA:BB". The helper checkBluetoothAddress(String) is available to validate a Bluetooth address.
通過指定的硬體地址獲取BluetoothDevice對象。有效的藍牙硬體地址必須是形如"00:11:22:33:AA:BB"的大寫字元串。可使用輔助方法checkBluetoothAddress(String)校驗地址(格式)的有效性。
A BluetoothDevice will always be returned for a valid hardware address, even if this adapter has never seen that device.
如地址有效則一個對應的BluetoothDevice對象被返回,即使適配器並未發現該設備。
Parameters 參數
address valid Bluetooth MAC address 有效的藍牙MAC地址
Throws
IllegalArgumentException if address is invalid
4. android app用什麼開發好
Android的開發技術很多,在開始學習的時候不可能一次性全部學會,也沒有必要一開始都全部學會,但是有些技術是非常常用的,需要在開始時打好基礎,這些技術時:
1、Activity生命周期
雖然Android中有四大組件,但是不可否認Activity是最常用的。所以熟練掌握Android的生命周期是必須的。其實生命周期就是記住 Activity的那些方法在什麼時候被系統調用,這樣才可以把對應的邏輯代碼寫到合適的方法內部去。
至於服務和廣播組件可以稍微緩一下,到實際使用的時候再學習都可以。
2、界面開發技術
界面開發是一種基本的技術,幾乎所有的程序裡面都需要用到。在Android開發中界面開發分為3種:
1)使用xml文件布局
使用xml首先對於界面進行布局,然後在Activity裡面進行引用是最常見的應用軟體開發技術,這種方式使用的最大,需要學習的內容也最多。學習時需要熟悉:
a)五種Layout布局
深刻理解五種布局組織控制項的方式是一個基本的基礎,這樣你才可以在實際的界面中靈活的使用每種布局結構,構造出需要的界面。
b)常用控制項
控制項有很多,至少要知道每種控制項是做什麼的,至於裡面的特定參數和方法可以學要的時候再去查
c)界面美化
系統的控制項很多時候無法滿足要求,需要通過添加背景更換圖片等進行美化,要熟悉每種控制項如何去美化。
掌握了上面的內容,通過布局的嵌套就可以製作出各種界面,如果在熟悉include的使用就可以減少xml的重復,方便後期的修改和維護了。
2)使用代碼動態創建
有些時候需要動態的創建一些布局和控制項,這個就需要使用LayoutInflater去創建一些動態的界面了。
3)自己繪制界面
游戲中常用,繼承SurfaceView自己繪制。
3、數據存儲技術
Android中的數據存儲方式有3種:
1)SharedPrefereneces存儲
對於簡單的數據可以使用該方式存儲,以鍵值對的方式存儲一些基本的數據。
2)文件存儲
將數據以文件的形式存儲,可以是手機自身的存儲也可以是SD卡,文件的數據格式自己定義。
3)SQLite資料庫存儲
使用標准SQL語句進行操作,復雜數據的首選。
4、網路編程
現在的Android程序不需要聯網的已經不多了。所以網路編程也是必須的,一般的公司都會封裝有自己的聯網結構,但是基本的聯網還是要熟悉。
1)HTTP聯網
使用Http聯網+Json數據格式是現在很多客戶端的首選。
2)Socket聯網
至於藍牙等連接方式則可以在項目需要的時候學習。
對於手機的系統功能,如撥打電話、發送簡訊、讀取系統參數等則可以根據需要在學習,不麻煩的。
其次,手機軟體相關
Android開發不同於普通的電腦軟體開發,需要了解手機的操作習慣,知道手機的屏幕不大、內存有限,電池有限等,在實際開發和設計時盡量考慮。