Android获取蓝牙设备列表的方法

简介: Android获取蓝牙设备列表的方法

android如何获取蓝牙设备了?


我们一步一步来分析,首先蓝牙属于一种短距离的无线通信技术,那作为我们android系统是否对此有过封装了?答案那肯定是有了!

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); //跳转到系统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";


不难看出这些应该是适配器给我们配置的广播标签,那我们就根据这些状态值来创建一个

BroadcastReceiver.class用来接收蓝牙适配器给我们发送的消息

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中注销广播啊)

// 注册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);


最后一步,开启蓝牙发送广播,然后在自己写的适配器上把收集到的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());
            }
        }
    }


目录
相关文章
|
21天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
45 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
45 2
|
3月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
132 1
|
3月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
423 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
3月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
50 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
3月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
55 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
3月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
78 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
3月前
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
48 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
|
3月前
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
43 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动
|
3月前
|
Linux Android开发 C语言
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
本文通过实践操作,展示了在Android系统中不编写任何代码,利用设备树(DTS)配置和内核支持的通用GPIO LED驱动来控制LED设备,并进一步通过C语言编写NDK测试APP来实现LED的闪烁效果。
140 0
不写一行代码(一):实现安卓基于GPIO的LED设备驱动