Android獲取藍牙設備列表的方法
最近換了一家公司,主要內容是做關于移動端室內定位的相關sdk,剛進來的時候信心滿滿,誓要干出一番天地!?。〗Y果進來快一個多月了,根本沒輪到我施展拳腳,給我擱置在一旁自己弄自己的。行吧,既然是做室內定位的話那無非就是(gps,藍牙,wifi等)這些技術來實現嘛,然后我們就可以有本篇的切入點了:
android如何獲取藍牙設備了?
我們一步一步來分析,首先藍牙屬于一種短距離的無線通信技術,那作為我們android系統(tǒng)是否對此有過封裝了?答案那肯定是有了!
BluetoothAdapter
android提供的藍牙適配器,既然有了適配器,接下來我們獲取藍牙列表就有了一個切口。首先我們獲取藍牙列表之前,先需要獲取藍牙相關的權限,我們在AndroidManifest.xml里加入權限以下權限:
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permissionandroid:name="android.permission.BLUETOOTH" />
接下來我們在檢查設備是否有藍牙功能
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { //通知用戶當前設備不具有藍牙功能 return; }
如果bluetoothAdapter != null, 我們再來檢查用戶是否開啟了藍牙功能
if (!bluetoothAdapter.isEnabled()){ //檢查是否開啟藍牙功能 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(intent); //跳轉到系統(tǒng)Activity,讓用戶選擇開啟藍牙功能 bluetoothAdapter.enable(); return; }
通過BluetoothAdapter源碼我們可以看到該類下面定義了很多常量值
public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED"; public static final String ACTION_DISCOVERY_FINISHED = "android.bluetooth.adapter.action.DISCOVERY_FINISHED"; public static final String ACTION_DISCOVERY_STARTED = "android.bluetooth.adapter.action.DISCOVERY_STARTED"; public static final String ACTION_LOCAL_NAME_CHANGED = "android.bluetooth.adapter.action.LOCAL_NAME_CHANGED"; public static final String ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE"; public static final String ACTION_REQUEST_ENABLE = "android.bluetooth.adapter.action.REQUEST_ENABLE"; public static final String ACTION_SCAN_MODE_CHANGED = "android.bluetooth.adapter.action.SCAN_MODE_CHANGED";
不難看出這些應該是適配器給我們配置的廣播標簽,那我們就根據這些狀態(tài)值來創(chuàng)建一個
BroadcastReceiver.class用來接收藍牙適配器給我們發(fā)送的消息
public class BlueToothBroadcast extends BroadcastReceiver { private List<String> blueToothList; private BlueToothListAdapter blueToothListAdapter; private List<String> stringList = new ArrayList<>; public BlueToothBroadcast(List<String> blueToothList, BlueToothListAdapter blueToothListAdapter) { this.blueToothList = blueToothList; this.blueToothListAdapter= blueToothListAdapter; } @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action){ case BluetoothDevice.ACTION_FOUND: //收集藍牙信息 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); String mac = (device.getAddress().replace(":", "")); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("設備名稱:" + device.getName() + "\n"); stringBuilder.append("mac地址:" + toLowerCase(mac, 0, mac.length()) + "\n"); //用一個新的string集合去對比設備名稱和mac地址,不能拼接rssi和uuid后再去對比 if (stringList.indexOf(stringBuilder.toString()) == -1) { // 防止重復添加 stringList.add(stringBuilder.toString()); if (device.getName() != null) { stringBuilder.append("rssi:" + intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI) + "\n"); stringBuilder.append("Uuid:" + device.getUuids()); blueToothList.add(stringBuilder.toString()); // 獲取設備名稱和mac地址 } } Log.d("searchDevices", "onReceive str: " + blueToothList.toString()); break; case BluetoothAdapter.ACTION_DISCOVERY_STARTED: //正在掃描 break; case BluetoothAdapter.ACTION_DISCOVERY_FINISHED: blueToothListAdapter.notifyDataSetChanged(); Toast.makeText(context, "掃描完成", Toast.LENGTH_SHORT).show(); break; } } //格式化mac地址 public static String toLowerCase(String str, int beginIndex, int endIndex) { return str.replaceFirst(str.substring(beginIndex, endIndex), str.substring(beginIndex, endIndex) .toLowerCase(Locale.getDefault())); } }
接下來在activity中去注冊我們的廣播(記得在ondestroy中注銷廣播?。?/p>
// 注冊Receiver來獲取藍牙設備相關的結果 broadcastReceiver = new BlueToothBroadcast(blueToothList,blueToothListAdapterr); IntentFilter intent = new IntentFilter(); intent.addAction(BluetoothDevice.ACTION_FOUND); // 用BroadcastReceiver來取得搜索結果 intent.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); intent.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(broadcastReceiver, intent);
最后一步,開啟藍牙發(fā)送廣播,然后在自己寫的適配器上把收集到的list加載上去,完事兒!
這套下來我們的藍牙設備列表就獲取完成了!快去試試
if (!bluetoothAdapter.isDiscovering()) { blueToothList.clear(); addPairedDevice();//添加藍牙配對設備 bluetoothAdapter.startDiscovery(); } private void addPairedDevice() { Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); if (pairedDevices != null && pairedDevices.size() > 0) { for (BluetoothDevice device : pairedDevices) { String mac = (device.getAddress().replace(":", "")); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(getString(R.string.device_name)).append(device.getName()).append("\n"); stringBuilder.append(getString(R.string.mac_ip)).append(toLowerCase(mac, 0, mac.length())).append("\n"); stringBuilder.append(getString(R.string.uuid)).append(Arrays.toString(device.getUuids())); blueToothList.add(stringBuilder.toString()); } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
如何利用Android Studio將moudle變成jar示例詳解
這篇文章主要給大家介紹了關于如何利用Android Studio將moudle變成jar的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來跟著小編一起學習學習吧。2017-08-08圖文講解Android的ImageView類中的ScaleType屬性設置
這篇文章主要介紹了Android的ImageView類中的ScaleType屬性設置,同時文中還講了實現圖片寬度100%ImageView寬度且高度按比例自動伸縮的方法,需要的朋友可以參考下2016-03-03Android Studio 4.0 正式發(fā)布在Ubuntu 20.04中安裝的方法
這篇文章主要介紹了Android Studio 4.0 正式發(fā)布如何在Ubuntu 20.04中安裝,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06