安卓藍牙app開發(fā)教程(安卓開發(fā) 藍牙)
本篇文章給大家談?wù)劙沧克{牙app開發(fā)教程,以及安卓開發(fā) 藍牙對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站喔。
如何使用Android藍牙開發(fā)
Android平臺支持藍牙網(wǎng)絡(luò)協(xié)議棧,實現(xiàn)藍牙設(shè)備之間數(shù)據(jù)的無線傳輸。本文檔描述了怎樣利用android平臺提供的藍牙API去實現(xiàn)藍壓設(shè)備之間的通信。藍牙具有point-to-point 和 multipoint兩種連接功能。
使用藍牙API,可以做到:
* 搜索藍牙設(shè)備
* 從本地的Bluetooth adapter中查詢已經(jīng)配對的設(shè)備
* 建立RFCOMM通道
* 通過service discovery連接到其它設(shè)備
* 在設(shè)備之間傳輸數(shù)據(jù)
* 管理多個連接
基礎(chǔ)知識
本文檔介紹了如何使用Android的藍牙API來完成的四個必要的主要任務(wù),使用藍牙進行設(shè)備通信,主要包含四個部分:藍牙設(shè)置、搜索設(shè)備(配對的或可見的)、連接、傳輸數(shù)據(jù)。
所有的藍牙API在android.bluetooth包中。實現(xiàn)這些功能主要需要下面這幾個類和接口:
BluetoothAdapter
代表本地藍牙適配器(藍牙發(fā)射器),是所有藍牙交互的入口。通過它可以搜索其它藍牙設(shè)備,查詢已經(jīng)配對的設(shè)備列表,通過已知的MAC地址創(chuàng)建BluetoothDevice,創(chuàng)建BluetoothServerSocket監(jiān)聽來自其它設(shè)備的通信。
BluetoothDevice
代表了一個遠端的藍牙設(shè)備, 使用它請求遠端藍牙設(shè)備連接或者獲取 遠端藍牙設(shè)備的名稱、地址、種類和綁定狀態(tài)。 (其信息是封裝在 bluetoothsocket 中) 。
BluetoothSocket
代表了一個藍牙套接字的接口(類似于 tcp 中的套接字) ,他是應(yīng)用程 序通過輸入、輸出流與其他藍牙設(shè)備通信的連接點。
BluetoothServerSocket
代表打開服務(wù)連接來監(jiān)聽可能到來的連接請求 (屬于 server 端) , 為了連接兩個藍牙設(shè)備必須有一個設(shè)備作為服務(wù)器打開一個服務(wù)套接字。 當(dāng)遠端設(shè)備發(fā)起連 接連接請求的時候,并且已經(jīng)連接到了的時候,Blueboothserversocket 類將會返回一個 bluetoothsocket。
BluetoothClass
描述了一個設(shè)備的特性(profile)或該設(shè)備上的藍牙大致可以提供哪些服務(wù)(service),但不可信。比如,設(shè)備是一個電話、計算機或手持設(shè)備;設(shè)備可以提供audio/telephony服務(wù)等??梢杂盟鼇磉M行一些UI上的提示。
BluetoothProfile
BluetoothHeadset
提供手機使用藍牙耳機的支持。這既包括藍牙耳機和免提(V1.5)模式。
BluetoothA2dp
定義高品質(zhì)的音頻,可以從一個設(shè)備傳輸?shù)搅硪粋€藍牙連接。 “A2DP的”代表高級音頻分配模式。
BluetoothHealth
代表了醫(yī)療設(shè)備配置代理控制的藍牙服務(wù)
BluetoothHealthCallback
一個抽象類,使用實現(xiàn)BluetoothHealth回調(diào)。你必須擴展這個類并實現(xiàn)回調(diào)方法接收更新應(yīng)用程序的注冊狀態(tài)和藍牙通道狀態(tài)的變化。
BluetoothHealthAppConfiguration
代表一個應(yīng)用程序的配置,藍牙醫(yī)療第三方應(yīng)用注冊與遠程藍牙醫(yī)療設(shè)備交流。
BluetoothProfile.ServiceListener
當(dāng)他們已經(jīng)連接到或從服務(wù)斷開時通知BluetoothProfile IPX的客戶時一個接口(即運行一個特定的配置文件,內(nèi)部服務(wù))。
藍牙權(quán)限
為了在你的應(yīng)用中使用藍牙功能,至少要在AndroidManifest.xml中聲明兩個權(quán)限:BLUETOOTH(任何藍牙相關(guān)API都要使用這個權(quán)限) 和 BLUETOOTH_ADMIN(設(shè)備搜索、藍牙設(shè)置等)。
為了執(zhí)行藍牙通信,例如連接請求,接收連接和傳送數(shù)據(jù)都必須有BLUETOOTH權(quán)限。
必須要求BLUETOOTH_ADMIN的權(quán)限來啟動設(shè)備發(fā)現(xiàn)或操縱藍牙設(shè)置。大多數(shù)應(yīng)用程序都需要這個權(quán)限能力,發(fā)現(xiàn)當(dāng)?shù)氐乃{牙設(shè)備。此權(quán)限授予其他的能力不應(yīng)該使用,除非應(yīng)用程序是一個“電源管理”,將根據(jù)用戶要求修改的藍牙設(shè)置
注釋:要請求BLUETOOTH_ADMIN的話,必須要先有BLUETOOTH。
在你的應(yīng)用manifest 文件中聲明藍牙權(quán)限。例如:
manifest ...
uses-permission android:name="android.permission.BLUETOOTH" /
...
/manifest
通過查看uses-permission資料來聲明應(yīng)用權(quán)限獲取更多的信息。
藍牙設(shè)置
在你的應(yīng)用通過藍牙進行通信之前,你需要確認設(shè)備是否支持藍牙,如果支持,確信它被打開。
如果不支持,則不能使用藍牙功能。如果支持藍牙,但不能夠使用,你剛要在你的應(yīng)用中請求使用藍牙。這個要兩步完成,使用BluetoothAdapter。
android藍牙開發(fā),PC端模擬串口接收字符,該如何編程?
您好,android藍牙這方面還是很好搞的,因為大家的方式都是差不多的。先說說如何開啟藍牙設(shè)備和設(shè)置可見時間:
private void search() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (!adapter.isEnabled()) {
adapter.enable();
}
Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600); //3600為藍牙設(shè)備可見時間
startActivity(enable);
Intent searchIntent = new Intent(this, ComminuteActivity.class);
startActivity(searchIntent);
}
首先,需要獲得一個BluetoothAdapter,可以通過getDefaultAdapter()獲得系統(tǒng)默認的藍牙適配器,當(dāng)然我們也可以自己指定,但這個真心沒有必要,至少我是不需要的。然后我們檢查手機的藍牙是否打開,如果沒有,通過enable()方法打開。接著我們再設(shè)置手機藍牙設(shè)備的可見,可見時間可以自定義。
完成這些必要的設(shè)置后,我們就可以正式開始與藍牙模塊進行通信了:
public class ComminuteActivity extends Activity {
private BluetoothReceiver receiver;
private BluetoothAdapter bluetoothAdapter;
private ListString devices;
private ListBluetoothDevice deviceList;
private Bluetooth client;
private final String lockName = "BOLUTEK";
private String message = "000001";
private ListView listView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_layout);
listView = (ListView) this.findViewById(R.id.list);
deviceList = new ArrayListBluetoothDevice();
devices = new ArrayListString();
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter.startDiscovery();
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
receiver = new BluetoothReceiver();
registerReceiver(receiver, filter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView? parent, View view, int position, long id) {
setContentView(R.layout.connect_layout);
BluetoothDevice device = deviceList.get(position);
client = new Bluetooth(device, handler);
try {
client.connect(message);
} catch (Exception e) {
Log.e("TAG", e.toString());
}
}
});
}
@Override
protected void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case Bluetooth.CONNECT_FAILED:
Toast.makeText(ComminuteActivity.this, "連接失敗", Toast.LENGTH_LONG).show();
try {
client.connect(message);
} catch (Exception e) {
Log.e("TAG", e.toString());
}
break;
case Bluetooth.CONNECT_SUCCESS:
Toast.makeText(ComminuteActivity.this, "連接成功", Toast.LENGTH_LONG).show();
break;
case Bluetooth.READ_FAILED:
Toast.makeText(ComminuteActivity.this, "讀取失敗", Toast.LENGTH_LONG).show();
break;
case Bluetooth.WRITE_FAILED:
Toast.makeText(ComminuteActivity.this, "寫入失敗", Toast.LENGTH_LONG).show();
break;
case Bluetooth.DATA:
Toast.makeText(ComminuteActivity.this, msg.arg1 + "", Toast.LENGTH_LONG).show();
break;
}
}
};
private class BluetoothReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (isLock(device)) {
devices.add(device.getName());
}
deviceList.add(device);
}
showDevices();
}
}
private boolean isLock(BluetoothDevice device) {
boolean isLockName = (device.getName()).equals(lockName);
boolean isSingleDevice = devices.indexOf(device.getName()) == -1;
return isLockName isSingleDevice;
}
private void showDevices() {
ArrayAdapterString adapter = new ArrayAdapterString(this, android.R.layout.simple_list_item_1,
devices);
listView.setAdapter(adapter);
}
}
如何使用android原生BLE藍牙進行操作?
之前的涉及的物聯(lián)網(wǎng)項目中使用的: BLE 低功耗藍牙(藍牙4.0), 支持android 4.3以上的手機
主從關(guān)系: BLE低功耗藍牙只能做從端設(shè)備 ,一個藍牙主端設(shè)備,可同時與7個藍牙從端設(shè)備進行通訊
1)低功耗
低功耗的原理:
1\低功耗藍牙僅使用了3個廣播通道,傳統(tǒng)藍牙技術(shù)采用 16~32 個頻道
2\每次廣播開啟時間也由傳統(tǒng)的 22.5ms 減少到 0.6~1.2ms(毫秒)
2)傳輸距離極大提高
傳統(tǒng)藍牙傳輸距離為 2~10m,而藍牙4.0的有效傳輸距離可達到 60~100m
3)安全性
使用AES-128 CCM加密算法進行數(shù)據(jù)包加密和認證。
更多BLE藍牙的解析參考博客 : BLE4.0教程一 藍牙協(xié)議連接過程與廣播分析
添加權(quán)限
打開藍牙
1.先拿到BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
2.再拿到BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
判斷是否打開藍牙
未打開彈出 系統(tǒng)彈框 ,除了 魅族手機 是打開系統(tǒng)設(shè)置
設(shè)備/手機都是藍牙信號
在回調(diào)方法中:
一般在掃描的過程中,我們還會設(shè)置 設(shè)備過濾原則 (因為我只想要搜索到我們想要的設(shè)備,忽略無關(guān)設(shè)備)
如:從 scanRecord -- beacon -- beacon.type == 0xFF代表Manufacture,通過與嵌入式軟件定義 自己的 Manufacture值即可
用BluetoothDevice得到BluetoothGatt:
斷連:
關(guān)鍵問題:連接后一般要做什么事?
( 必須在剛連接成功后2秒內(nèi)app寫一個值給設(shè)備,否則會被設(shè)備斷開連接)
主要是讀寫 characteristic
gatt.wirteCharacteristic(mCurrentcharacteristic);
gatt.readCharacteristic(characteristic);
bluetoothGatt.setCharacteristicNotification(data, true);
真實工作中使用的藍牙庫BlueToothKit請參考我的另一篇博客:
android藍牙入門知識和優(yōu)秀藍牙第三方庫BluetoothKit的使用
微信小程序藍牙教程--完整版親測
#使用mpvue 開發(fā)小程序過程中 簡單介紹一下微信小程序藍牙連接過程
#在藍牙連接的過程中部分api需要加定時器延時1秒到2秒左右再執(zhí)行,原因為何不知道,小程序有這樣的要求
#1.首先是要初始化藍牙:openBluetoothAdapter()
```js
if (wx.openBluetoothAdapter) {
wx.openBluetoothAdapter({
? ? ? ? success: function(res) {
????????????/* 獲取本機的藍牙狀態(tài) */
? ? ? ? ? ? setTimeout(() = {
????????????????getBluetoothAdapterState()
????????????}, 1000)
????????},
? ? ? ? fail: function(err) {
????????????// 初始化失敗
????????}
????})
????} else {????
????}
```
#2.檢測本機藍牙是否可用:
#? 要在上述的初始化藍牙成功之后回調(diào)里調(diào)用
```js
getBluetoothAdapterState() {
? ? var that= this;
? ? that.toastTitle= '檢查藍牙狀態(tài)'
wx.getBluetoothAdapterState({
? ? ? ? success: function(res) {
startBluetoothDevicesDiscovery()
},
? ? ? ? fail(res) {
? ? ? ? ? ? console.log(res)
}
})
}
```
#3. 開始搜索藍牙設(shè)備:
```js
startBluetoothDevicesDiscovery() {
? ? var that= this;
? ? setTimeout(() = {
wx.startBluetoothDevicesDiscovery({
? ? ? ? ? ? success: function(res) {
/* 獲取藍牙設(shè)備列表 */
? ? ? ? ? ? ? ? that.getBluetoothDevices()
},
? ? ? ? ? ? fail(res) {
}
})
}, 1000)
}
```
#4. 獲取搜索到的藍牙設(shè)備列表
# /* that.deviceName 是獲取到的藍牙設(shè)備的名稱, 因為藍牙設(shè)備在安卓和蘋果手機上搜到的藍牙地址顯示是不一樣的,所以根據(jù)設(shè)備名稱匹配藍牙*/
```js
getBluetoothDevices() {
? ? var that= this;
? ? setTimeout(() = {
wx.getBluetoothDevices({
? ? ? ? ? ? services: [],
? ? ? ? ? ? allowDuplicatesKey: false,
? ? ? ? ? ? interval: 0,
? ? ? ? ? ? success: function(res) {
? ? ? ? ? ? ? ? if (res.devices.length 0) {
? ? ? ? ? ? ? ? ? ? if (JSON.stringify(res.devices).indexOf(that.deviceName) !== -1) {
? ? ? ? ? ? ? ? ? ? ? ? for (let i = 0; i res.devices.length; i++) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? if (that.deviceName === res.devices[i].name) {
/* 根據(jù)指定的藍牙設(shè)備名稱匹配到deviceId */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.deviceId = that.devices[i].deviceId;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setTimeout(() = {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.connectTO();
}, 2000);
};
};
} else {
}
} else {
}
},
? ? ? ? ? ? fail(res) {
? ? ? ? ? ? ? ? console.log(res, '獲取藍牙設(shè)備列表失敗=====')
}
})
}, 2000)
},
```
#5.連接藍牙
# 匹配到的藍牙設(shè)備ID 發(fā)送連接藍牙的請求, 連接成功之后 應(yīng)該斷開藍牙搜索的api,然后去獲取所連接藍牙設(shè)備的service服務(wù)
```js
connectTO() {
wx.createBLEConnection({
? ? ? ? deviceId: deviceId,
? ? ? ? success: function(res) {
? ? ? ? ? ? that.connectedDeviceId = deviceId;
/* 4.獲取連接設(shè)備的service服務(wù) */
that.getBLEDeviceServices();
wx.stopBluetoothDevicesDiscovery({
? ? ? ? ? ? ? ? success: function(res) {
? ? ? ? ? ? ? ? ? ? console.log(res, '停止搜索')
},
? ? ? ? ? ? ? ? fail(res) {
}
})
},
? ? ? ? fail: function(res) {
}
})
}
```
#6. 獲取藍牙設(shè)備的service服務(wù),獲取的serviceId有多個要試著連接最終確定哪個是穩(wěn)定版本的service 獲取服務(wù)完后獲取設(shè)備特征值
```js
getBLEDeviceServices() {
? ? setTimeout(() = {
wx.getBLEDeviceServices({
? ? ? ? ? ? deviceId: that.connectedDeviceId,
? ? ? ? ? ? success: function(res) {
? ? ? ? ? ? ? ? that.services= res.services
/* 獲取連接設(shè)備的所有特征值 */
that.getBLEDeviceCharacteristics()
},
? ? ? ? ? ? fail: (res) = {
}
})
}, 2000)
},
```
#7.獲取藍牙設(shè)備特征值
# 獲取到的特征值有多個,最后要用的事能讀,能寫,能監(jiān)聽的那個值的uuid作為特征值id,
```js
getBLEDeviceCharacteristics() {
? ? ? ? ? ? setTimeout(() = {
wx.getBLEDeviceCharacteristics({
? ? ? ? ? ? ? ? ? ? deviceId: connectedDeviceId,
? ? ? ? ? ? ? ? ? ? serviceId: services[2].uuid,
? ? ? ? ? ? ? ? ? ? success: function(res) {
? ? ? ? ? ? ? ? ? ? ? ? for (var i = 0; i res.characteristics.length; i++) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? if ((res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (res.characteristics[i].properties.read res.characteristics[i].properties.write)) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? console.log(res.characteristics[i].uuid, '藍牙特征值 ==========')
/* 獲取藍牙特征值 */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.notifyCharacteristicsId = res.characteristics[i].uuid
// 啟用低功耗藍牙設(shè)備特征值變化時的 notify 功能
that.notifyBLECharacteristicValueChange()
}
}
},
? ? ? ? ? ? ? ? ? ? fail: function(res) {
}
})
}, 1000)
},
```
#8.啟動notify 藍牙監(jiān)聽功能 然后使用 wx.onBLECharacteristicValueChange用來監(jiān)聽藍牙設(shè)備傳遞數(shù)據(jù)
#接收到的數(shù)據(jù)和發(fā)送的數(shù)據(jù)必須是二級制數(shù)據(jù), 頁面展示的時候需要進行轉(zhuǎn)換
```js
notifyBLECharacteristicValueChange() { // 啟用低功耗藍牙設(shè)備特征值變化時的 notify 功能
? ? ? ? ? ? var that= this;
? ? ? ? ? ? console.log('6.啟用低功耗藍牙設(shè)備特征值變化時的 notify 功能')
wx.notifyBLECharacteristicValueChange({
? ? ? ? ? ? ? ? state: true,
? ? ? ? ? ? ? ? deviceId: that.connectedDeviceId,
? ? ? ? ? ? ? ? serviceId: that.notifyServicweId,
? ? ? ? ? ? ? ? characteristicId: that.notifyCharacteristicsId,
? ? ? ? ? ? ? ? complete(res) {
/*用來監(jiān)聽手機藍牙設(shè)備的數(shù)據(jù)變化*/
wx.onBLECharacteristicValueChange(function(res) {
/**/
? ? ? ? ? ? ? ? ? ? ? ? that.balanceData += that.buf2string(res.value)
? ? ? ? ? ? ? ? ? ? ? ? that.hexstr += that.receiveData(res.value)
})
},
? ? ? ? ? ? ? ? fail(res) {
? ? ? ? ? ? ? ? ? ? console.log(res, '啟用低功耗藍牙設(shè)備監(jiān)聽失敗')
? ? ? ? ? ? ? ? ? ? that.measuringTip(res)
}
})
},
/*轉(zhuǎn)換成需要的格式*/
buf2string(buffer) {
? ? ? ? ? ? ? ? ? ? var arr = Array.prototype.map.call(new Uint8Array(buffer), x = x)
? ? ? ? ? ? ? ? ? ? return arr.map((char, i) = {
? ? ? ? ? ? ? ? ? ? ? ? return String.fromCharCode(char);
? ? ? ? ? ? ? ? ? ? }).join('');
},
receiveData(buf) {
return this.hexCharCodeToStr(this.ab2hex(buf))
},
/*轉(zhuǎn)成二進制*/
ab2hex (buffer) {
? ? ? ? ? ? ? var hexArr = Array.prototype.map.call(
? ? ? ? ? ? ? ? ? new Uint8Array(buffer), function (bit) {
? ? ? ? ? ? ? ? ? ? ? return ('00' + bit.toString(16)).slice(-2)
}
)
? ? ? ? ? ? ? return hexArr.join('')
},
/*轉(zhuǎn)成可展會的文字*/
hexCharCodeToStr(hexCharCodeStr) {
? ? ? ? ? ? ? var trimedStr = hexCharCodeStr.trim();
? ? ? ? ? ? ? var rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;
? ? ? ? ? ? ? var len = rawStr.length;
? ? ? ? ? ? ? var curCharCode;
? ? ? ? ? ? ? var resultStr= [];
? ? ? ? ? ? ? for (var i = 0; i len; i = i+ 2) {
? ? ? ? ? ? ? ? ? curCharCode = parseInt(rawStr.substr(i, 2), 16);
? ? ? ? ? ? ? ? ? resultStr.push(String.fromCharCode(curCharCode));
}
? ? ? ? ? ? ? return resultStr.join('');
},
```
# 向藍牙設(shè)備發(fā)送數(shù)據(jù)
```js
sendData(str) {
? ? let that= this;
? ? let dataBuffer = new ArrayBuffer(str.length)
? ? let dataView = new DataView(dataBuffer)
? ? for (var i = 0; i str.length; i++) {
? ? ? ? dataView.setUint8(i, str.charAt(i).charCodeAt())
}
? ? let dataHex = that.ab2hex(dataBuffer);
? ? this.writeDatas = that.hexCharCodeToStr(dataHex);
wx.writeBLECharacteristicValue({
? ? ? ? deviceId: that.connectedDeviceId,
? ? ? ? serviceId: that.notifyServicweId,
? ? ? ? characteristicId: that.notifyCharacteristicsId,
? ? ? ? value: dataBuffer,
? ? ? ? success: function (res) {
? ? ? ? ? ? console.log('發(fā)送的數(shù)據(jù):' + that.writeDatas)
? ? ? ? ? ? console.log('message發(fā)送成功')
},
? ? ? ? fail: function (res) {
},
? ? ? ? complete: function (res) {
}
})
},
```
# 當(dāng)不需要連接藍牙了后就要關(guān)閉藍牙,并關(guān)閉藍牙模塊
```js
// 斷開設(shè)備連接
closeConnect() {
if (that.connectedDeviceId) {
wx.closeBLEConnection({
? ? ? ? ? ? deviceId: that.connectedDeviceId,
? ? ? ? ? ? success: function(res) {
that.closeBluetoothAdapter()
},
? ? ? ? ? ? fail(res) {
}
})
} else {
that.closeBluetoothAdapter()
}
},
// 關(guān)閉藍牙模塊
closeBluetoothAdapter() {
wx.closeBluetoothAdapter({
? ? ? ? success: function(res) {
},
? ? ? ? fail: function(err) {
}
})
},
```
#在向藍牙設(shè)備傳遞數(shù)據(jù)和接收數(shù)據(jù)的過程中,并未使用到read的API 不知道有沒有潛在的問題,目前線上運行為發(fā)現(xiàn)任何的問題
#今天的藍牙使用心得到此結(jié)束,謝謝
新手剛剛學(xué)習(xí)android,推薦android開發(fā)的入門教程
學(xué)習(xí)android注意事項:
1,android技術(shù)準備實訓(xùn)目標:通過這部分的學(xué)習(xí),學(xué)員能夠達到學(xué)習(xí)android開發(fā)課程的基本要求。熟練使用Java語言,實現(xiàn)GUI桌面應(yīng)用程序的開發(fā)JDK的安裝和配置開發(fā)工具Eclipse3.4安裝。實訓(xùn)知識點: Java標識符、數(shù)據(jù)類型流程控制、面向?qū)ο缶幊?、繼承、抽象類、接口、包、異常、IO流、Swing、游戲算法介紹
,2,android入門實訓(xùn)目標:通過這部分的學(xué)習(xí),學(xué)員具備了android程序開發(fā)的能力,能獨立完成常用的應(yīng)用軟件。實訓(xùn)知識點: Android系統(tǒng)概述和內(nèi)置工具、Android 開發(fā)環(huán)境的搭建和啟動模擬器、建立android工程、Android應(yīng)用程序開發(fā)及運行編譯結(jié)構(gòu)、API參考文檔的使用、使用am工具啟動android應(yīng)用程序、部署應(yīng)用到真實手機、控件和事件編程、菜單編程、對話框編程、視圖組編程、各種布局的使用、Grid視圖組、List視圖組、使用Tab組織UI
,3,android進階實訓(xùn)目標:通過這部分的學(xué)習(xí),學(xué)員的android開發(fā)能力會有大幅提高。等傳感器編程、android優(yōu)化和性能提高。實訓(xùn)知識點及案例分析:Service概述、創(chuàng)建和啟動、生命周期、權(quán)限及跨進程調(diào)用;廣播的概念及生命周期、廣播發(fā)送的權(quán)限廣播接收器的實現(xiàn)、接收SMS短信、播放MP3;內(nèi)容提供器的概念作用和常見接口、使用內(nèi)容提供器實現(xiàn)增刪改查、內(nèi)容提供其權(quán)限和創(chuàng)建內(nèi)容提供器、SQLite數(shù)據(jù)庫添刪改查操作、使用list視圖組顯示數(shù)據(jù);Widget概念和制作方法、Widget各種XML描述文件詳解2D圖形圖像及文本、Gallery UI編程、GridView編程、OnDraw編程、drawable編程基本動畫編程技巧、Tween動畫、Frame動畫、TimerOpenGL ES的2D和3D繪圖GPS服務(wù)、GPRS網(wǎng)絡(luò)使用、android藍牙開發(fā)、android方向、加速表、光線、磁場、臨近性、溫度
4,項目實戰(zhàn)實訓(xùn)目標:本階段讓學(xué)員開發(fā),設(shè)計Android網(wǎng)上購物系統(tǒng),其中包括Android圖形界面開發(fā),Android聲音,Android網(wǎng)絡(luò)通訊,和服務(wù)器后端進行通訊交換數(shù)據(jù)。
Android基礎(chǔ)知識:
一、Android開發(fā)的分類:
1、Android客戶端應(yīng)用程序
如新浪微博、網(wǎng)銀客戶端、凡客、淘寶客戶端,快盤客戶端。Android在這里的應(yīng)用還是界面層的東西為主。核心還在WEB??蛻舳私缑婧苤匾?,用戶體驗度很重要。從應(yīng)用需求上來講,幾乎大一點的網(wǎng)站,都需要有手機客戶端程序。
2、Android通用類程序
如基于LBS(基于位置的服務(wù))的應(yīng)用 (這類一般會嵌入到客戶端應(yīng)用程序中),流媒體播放應(yīng)用。由于移動設(shè)備的方便便捷、3G、4G網(wǎng)絡(luò)的發(fā)展,這類應(yīng)用有不錯的前景。
3、Android游戲開發(fā)
需要掌握的游戲引擎LGame,游戲框架等。手機上的游戲會是一大塊內(nèi)容,有前途。
4、Android底層開發(fā)
需要掌握C、Linux等較底層的東西,發(fā)展方向應(yīng)該是驅(qū)動、協(xié)議開發(fā),嵌入式開發(fā)。
開始學(xué)習(xí)了解一般從界面、控件開始,這也是大部分人認為簡單、比較快上手的原因。學(xué)習(xí)一段時間后,自己可以定一個方向發(fā)展。
二、Android學(xué)習(xí)需要哪些知識點
1、Java基礎(chǔ)知識
J2SE:Java基礎(chǔ)類(lang包,IO包,util包(集合框架),面向?qū)ο?,多線程,網(wǎng)絡(luò)編程)
2、J2EE知識
如果你想從事的Android客戶端應(yīng)用程序的開發(fā),這部分知識是必備的。顯然Android客戶端只是做的數(shù)據(jù)的請求、展現(xiàn),所需的數(shù)據(jù)在服務(wù)器端。
技能點:Tomcat(Weblogic),XML解析,JSON解析,JSP/Servlet。了解SSH。
3、Linux、C語言知識
可以作為你后續(xù)發(fā)展需要了解的。
在論壇上、QQ上看到不少童鞋Java基礎(chǔ)還比較欠缺,就開始搞Android了,當(dāng)然就問題多多。學(xué)習(xí)熱情可嘉,但需要打一個好的基礎(chǔ),有一個好的學(xué)習(xí)路線。
三、Android學(xué)習(xí)比較好的資料
1、應(yīng)該說現(xiàn)在市面上的書,入門的還是不少,但一般現(xiàn)在只講了簡單控件的單個用法。
《Android開發(fā)范例大全》,《Android應(yīng)用開發(fā)詳解》可以參考。想了解游戲的話,可以參考《Android2.0游戲開發(fā)實戰(zhàn)寶典》。
2、Android學(xué)習(xí)視頻,也基本上停留在講簡單入門,單個控件用法為主,這方面遠不及Java,J2EE,SSH的視頻那么豐富。應(yīng)該講,你看完了這些,離開發(fā)還有很大一段距離。而且,這些視頻在講課方法上不如一些Java的好?,F(xiàn)在的視頻資料太豐富,從哈佛、斯坦福的課程,到IPHONE開發(fā)課程,都有。但全部跟著視頻完成所有的學(xué)習(xí),有很長一段跟要走。
3、Android的論壇比較多,論壇的缺點就是什么東西得自己一個個查找、去等。自學(xué)是一個艱苦而漫長的過程。對你的鍛煉和提升也最大。自學(xué)有一個缺點,就是容易迷失方向,一個知識點你永遠不知道要掌握多深,相關(guān)的應(yīng)用是什么。自學(xué)就好比像你一個人在走一條目標很遠,前面叉路很多的暗道一樣。
4、培訓(xùn)機構(gòu)學(xué)習(xí)。如果你時間上允許不失為一種好的選擇,可以快速入門?;ヂ?lián)網(wǎng)產(chǎn)品(時代)有一個重要特點,就是拿資金換時間。如果能快速入門,到這個行業(yè)去發(fā)展,就比自己慢慢學(xué)習(xí)要好得多。畢竟現(xiàn)在Android開發(fā)太熱了。對開發(fā)人員的要求也會逐漸提高。(如既要求能做Android開發(fā),又做IPHONE移植開發(fā))。
如何創(chuàng)建一個安卓手機的APP,用于模擬遙控器鍵盤,輸出藍牙信號?
我有做這樣的app, 也做過USB串口通信和通過藍牙控制單片機的程序, QQ2227421573
安卓藍牙app開發(fā)教程的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于安卓開發(fā) 藍牙、安卓藍牙app開發(fā)教程的信息別忘了在本站進行查找喔。