在Android平臺(tái)開(kāi)發(fā)藍(lán)牙應(yīng)用程序
通過(guò)自己的學(xué)習(xí)和探索,講解一下Android平臺(tái)下掰派,上層藍(lán)牙應(yīng)用的開(kāi)發(fā)。
開(kāi)發(fā)Android藍(lán)牙應(yīng)用的基本步驟
- 以下代碼中的變量
BluetoothAdapter bluetoothAdapter;
- 設(shè)置權(quán)限
自從Android6.0以后载庭,在一些比較危險(xiǎn)的權(quán)限上要求必須申請(qǐng)動(dòng)態(tài)權(quán)限生兆。但是申請(qǐng)藍(lán)牙權(quán)限還是直接申請(qǐng)靜態(tài)權(quán)限即可。(在AndroidManifest.xml中聲明使用藍(lán)牙權(quán)限)
<uses-permission android:name=“android.permission.BLUETOOTH”/>
<uses-permission android:name=“android.permission.BLUETOOTH_ADMIN”/>
- 啟動(dòng)藍(lán)牙
在啟動(dòng)藍(lán)牙之前拴还,還需要做一個(gè)操作跨晴,那就是需要判斷本機(jī)是否支持藍(lán)牙。(童鞋們片林,虛擬機(jī)是沒(méi)有藍(lán)牙的哦)
//啟動(dòng)藍(lán)牙
void startBluetooth(){
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null)
//說(shuō)明不支持藍(lán)牙
return;
if (!bluetoothAdapter.isEnabled()){ //檢測(cè)藍(lán)牙是否開(kāi)啟
//沒(méi)有開(kāi)啟藍(lán)牙坟奥,則開(kāi)啟藍(lán)牙
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,1);
}else {
//藍(lán)牙正常開(kāi)啟
}
}
順便說(shuō)一下startActivityForResult(Intent intent, int requestCode)。此方法可以判斷是否調(diào)用成功拇厢,還可以判斷從哪個(gè)activity返回來(lái)的。 比如ActivityB和ActivityC都可以start ActivityA晒喷。因?yàn)閭魅氲膔equestCode不同孝偎,所以ActivityA可以判斷是哪個(gè)Activity調(diào)用的,從而進(jìn)行不同的操作凉敲。 需要重寫(xiě)@Override onActivityResult方法
- 發(fā)現(xiàn)藍(lán)牙
- 使藍(lán)牙處于可見(jiàn)(即處于易被搜索到的狀態(tài))衣盾,便于其他設(shè)備發(fā)現(xiàn)本機(jī)藍(lán)牙
//使本機(jī)藍(lán)牙在300s內(nèi)可被搜索
private void ensureDiscoverable(){
if (bluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE){
Intent discoverIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
startActivity(discoverIntent);
}
}
- 查找已經(jīng)配對(duì)過(guò)的藍(lán)牙設(shè)備寺旺,即以前已經(jīng)配對(duì)過(guò)的設(shè)備。
public Set getBluetoothDevices(){
Set<BluetoothDevice> bluetoothDevices = bluetoothAdapter.getBondedDevices();
if (bluetoothDevices.size() > 0){
for (BluetoothDevice bluetoothDevice : bluetoothDevices){
Log.d(“Bluetooth”,bluetoothDevice.getName() + “ | “ + bluetoothDevice.getAddress());
}
}else {
//沒(méi)有設(shè)備
}
return bluetoothDevices;
}
- 接下來(lái)比較重要势决,藍(lán)牙如何搜索設(shè)備阻塑。再次需要注冊(cè)一個(gè)BroadcastReceiver來(lái)獲取這個(gè)搜索結(jié)果。即先注冊(cè)信息果复,然后進(jìn)行處理陈莽。再次建議都用動(dòng)態(tài)注冊(cè)的方式,因?yàn)锳ndroid8.0已經(jīng)不支持靜態(tài)注冊(cè)虽抄。
//藍(lán)牙廣播
private BroadcastReceiver bluetoothBroadcastReceive = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)){
//發(fā)現(xiàn)設(shè)備走搁,可以看見(jiàn)本機(jī)藍(lán)牙可以搜索到哪些設(shè)備
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//判斷搜索到的藍(lán)牙是否已經(jīng)配對(duì)
if (device.getBondState() == BluetoothDevice.BOND_BONDED){
//已經(jīng)配對(duì)成功的
}else{
//尚未配對(duì)成功的
}
}else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
//正在搜索
}else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
//搜索結(jié)束
}
}
};
//動(dòng)態(tài)注冊(cè)藍(lán)牙廣播
IntentFilter bluetoothIntent = new IntentFilter();
bluetoothIntent.addAction(BluetoothDevice.ACTION_FOUND); bluetoothIntent.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
bluetoothIntent.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(bluetoothBroadcastReceive,bluetoothIntent);
最后別忘了注銷(xiāo)廣播,使用方法:
unregisterReceiver(bluetoothBroadcastReceive,bluetoothIntent)