編輯:關於Android編程
最近在實驗室做項目,使用了Android的藍牙開發,這裡面有好多坑..所以還是希望能記下來這些東西和大家分享,不要再走我的老路了。
先說一下背景,我是開發手機與帶藍牙的智能設備(藍牙血壓計、血糖儀、手環等)設備對接的APP。也就是說,在設備端沒有什麼可以操作的,手機負責發起數據傳輸。
配對
由於被曾經使用藍牙的思路所誤導,一直以為使用藍牙是必須一個配對的過程的。實際上不是這樣。搜索到設備以後,直接去connect
設備而不去配對,目前在我這裡是沒問題的,搜索到設備以後,可以直接用一下代碼進行連接:
final String SPP_UUID = 00001101-0000-1000-8000-00805F9B34FB;
UUID uuid = UUID.fromString(SPP_UUID);
BluetoothSocket socket;
socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
adapter.cancelDiscovery();
socket.connect();
這裡的UUID是比較好用的一個,設備都可以識別。
startDiscovey
有可能啟動失敗
一般程序中會有兩步:開啟藍牙
、開始尋找設備
。之前我寫的代碼是用戶按下按鈕就直接順序執行這兩步,導致的結果就是經常性搜索失敗。仔細看了一下API,發現adapter.startDiscovery()
函數是有一個boolean返回值的,也就是說如果啟動失敗就返回false。這就解釋了為什麼會啟動失敗了:順序執行了開啟藍牙
-尋找設備
的步驟,但是由於藍牙還沒有完全打開,就開始尋找設備,導致尋找失敗。於是最後我把代碼改成了這樣,問題解決:
adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null)
{
// 設備不支持藍牙
}
// 打開藍牙
if (!adapter.isEnabled())
{
adapter.enable();
adapter.cancelDiscovery();
}
// 尋找藍牙設備,android會將查找到的設備以廣播形式發出去
while (!adapter.startDiscovery()){
Log.e(BlueTooth, 嘗試失敗);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
接收數據轉換
使用socket.getInputStream
接收到的數據是字節流,這樣的數據是沒法分析的。又由於一般來說廠家給的協議都是類似於FA 22 89 D0這樣的十六進制數據,所以很多情況需要一個byte轉十六進制String的函數:
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);}
自己寫的安卓的計算器:注:這個是在mac中開發的,如果要在windows的eclipse中運行可能會出現路徑問題,解決辦法從windows中已有的安卓工程根目錄下復制一下
前言 本章將實現非常實用的功能——下載在線視頻。涉及到多線程、線程更新UI等技術,還需思考產品的設計,如何將新加的功能更好的融入到現有的產品中,並不是簡單的加一個界面就
1、如何對APK簽名(1)、創建數字證書,android123.keystore keytool -genkey -alias android123.keyst
前幾天去參加了帶著自己的作品去參加服務外包大賽,因為簽位抽到的比較靠後就等待了蠻久,就跟坐在前面的一起參賽的選手開始討論Android的開發經驗,各自給對方展示了自己的作