小工具知识网

当前位置: 首页 > 行业知识 > Android检测蓝牙是否连接获取蓝牙信息

行业知识

Android检测蓝牙是否连接获取蓝牙信息

2026-11-03 16:17:52 来源:互联网转载

实现功能

    • 检测是否拥有蓝牙权限
    • 监视蓝牙开关
    • 监视蓝牙连接断开
    • 获取蓝牙配对列表
    • 获取当前连接的蓝牙信息

    1.在AndroidManifest.xml文件中添加蓝牙权限

                                            

    2.在Activity的onCreate方法中进行运行时的动态权限获取(如果是在Activity类里面申请的直接把(Activity) mUniSDKInstance.getContext()替换成this即可。120这可以随便写)

    有人问为什么在AndroidManifest.xml文件中添加了蓝牙权限,为什么运行时还要申请一遍

    应为在 Android 6.0 (API 级别 23) 及更高版本中,用户需要在运行时授予权限。对于一些需要特殊权限的操作(如定位、读写存储等),仅在 AndroidManifest.xml 文件中声明这些权限是不够的,你还需要在运行时进行权限请求

    ActivityCompat.requestPermissions((Activity) mUniSDKInstance.getContext(), new String[]{Manifest.permission.BLUETOOTH}, 120);

    注意:这个请求会在手机上面进行UI弹窗,点击允许即可如果点击拒绝会获取不到蓝牙的任何操作

    3.创建自定义广播接收器(BroadcastReceiver)。这个类会响应系统发出的关于蓝牙状态的广播

     实现

    • 监视蓝牙开关
    • 监视蓝牙连接断开
    • 获取当前连接的蓝牙信息
      package io.bluet.uniplugin;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;/** * 全局蓝牙广播器 */public class MyBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        Log.e("Bluetooth", "action: "+action);        if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {            //蓝牙设备已断开连接            Log.e("Bluetooth", "蓝牙设备已断开连接");                    }else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)){            //蓝牙连接            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);            Log.e("Bluetooth", "蓝牙连接");            Log.e("Bluetooth", "连接蓝牙的名称: "+device.getName());            Log.e("Bluetooth", "连接蓝牙的地址: "+device.getAddress());        }        // 判断蓝牙是否打开        if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {            int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);            switch(state) {                case BluetoothAdapter.STATE_TURNING_ON:                    // 蓝牙正在打开                    Log.e("Bluetooth", "蓝牙正在打开");                    break;                case BluetoothAdapter.STATE_ON:                    // 蓝牙已经打开                    Log.e("Bluetooth", "蓝牙已经打开");                    break;                case BluetoothAdapter.STATE_TURNING_OFF:                    // 蓝牙正在关闭                    Log.e("Bluetooth", "蓝牙正在关闭");                    break;                case BluetoothAdapter.STATE_OFF:                    // 蓝牙已经关闭                    Log.e("Bluetooth", "蓝牙已经关闭");                    break;            }        }    }}

      4.在AndroidManifest.xml文件中注册您的自定义广播接收器(BroadcastReceiver)的配置项

                                                                                              

       android:name属性指定了您的广播接收器的完全限定类名(包名 + 类名)

      android:exported="true"表示其他应用可以给您的应用发送此广播。如果为"false"则表示只有系统或者应用内部可以发送此广播

      android:launchMode="singleInstance"表示此接收器的启动模式为单实例模式,即在进程存在的情况下不会重新创建接收器,而是复用已存在的实例

      标签为您的广播接收器定义了一个意图过滤器。这意味着您的广播接收器只接收满足过滤器配置的广播

      过滤器配置了三个,分别为: 

      • android.bluetooth.device.action.ACL_CONNECTED: 蓝牙设备已连接的广播;
      • android.bluetooth.device.action.ACL_DISCONNECTED: 蓝牙设备已断开的广播;
      • android.bluetooth.adapter.action.STATE_CHANGED: 蓝牙状态已改变的广播。

        在AndroidManifest.xml文件中的定义,MyBroadcastReceiver是全局的广播接收器 

        注意:上面的代码判断不了第一次进入app蓝牙的问题 。应为进入app的时候才注册的广播接收器之前的蓝牙操作是检测不到的,只能检测在app内操作蓝牙的消息,app外操作的蓝牙是检测不到的。

        5.下面代码是解决第一次进入app检测不到蓝牙通知的代码方法(每次进入app先使用这个进行判断蓝牙的一些列操作,后面app内的蓝牙操作可以用上面的广播进行实时获取蓝牙信息)

         public static void checkBluetoothPermissions(Context context){        BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter();        if (defaultAdapter == null){            // 设备不支持蓝牙功能            Log.e("Bluetooth", "设备不支持蓝牙功能");            return;        }else{            if (!defaultAdapter.isEnabled()){                //蓝牙未开启                Log.e("Bluetooth", "蓝牙未开启");                return;            }else{                // 蓝牙已开启                Log.e("Bluetooth", "蓝牙已开启");            }        }        try {            Set bluetoothDeviceSet =  defaultAdapter.getBondedDevices();            if (bluetoothDeviceSet.size() > 0){  //判断适配器里面是否有自己的耳机                  for (BluetoothDevice device : bluetoothDeviceSet) {   //这里的循环是获取手机里面所有配对成功的蓝牙信息                    // device 是已配对或已连接的蓝牙设备                    String deviceName = device.getName(); // 获取设备名称                    String deviceHardwareAddress = device.getAddress(); // 获取设备MAC地址                    // 根据设备的名称或地址,判断是哪一个蓝牙设备                    Log.e("Bluetooth", "蓝牙名称: "+device.getName());                    Log.e("Bluetooth", "蓝牙地址: "+device.getAddress());                       // Test  改成独特的耳机名称                    if ("Test".equals(deviceName)){                        defaultAdapter.getProfileProxy(context, new BluetoothProfile.ServiceListener() {                            @Override                            public void onServiceConnected(int profile, BluetoothProfile bluetoothProfile) {                                List devices = bluetoothProfile.getConnectedDevices();                                for (BluetoothDevice device : devices) {                                    // device 是已连接的蓝牙设备                                    String deviceName = device.getName(); // 获取设备名称                                    String deviceHardwareAddress = device.getAddress(); // 获取设备MAC地址                                    // 根据设备的名称或地址,判断是哪一个蓝牙设备                                    if ("Test".equals(deviceName)){                                                                           }else{                                                                            }                                }                            }                            @Override                            public void onServiceDisconnected(int i) {                            }                        }, BluetoothProfile.A2DP);                    }else{                                           }                }            }else{                Log.e("Bluetooth", "蓝牙列表里面没有配对或已连接的蓝牙设备");            }        }catch (SecurityException e){            Log.e("Bluetooth","获取不到蓝牙权限");        }    }

        Activity类里面的方法可以监听到app的生命周期,比如退出,进入,切换app。但是要在AndroidManifest.xml配置程序的入口

                                                                                

上一篇:电脑怎么选服务器设置网络?

下一篇:星露谷物语沙漠探险攻略揭秘,轻松前往沙漠,探险之旅不再难!