当前位置: 首页 > 知识库问答 >
问题:

获取 android 3.1 及更高版本中已连接的蓝牙低功耗设备列表

越信鸥
2023-03-14

我正在开发显示某些连接的蓝牙低功耗设备列表的应用程序,因此用户可以选择要配置哪一个。

问题是你不能只列出所有连接的设备。据我所知,有三种可能的方法:

> < li>

使用蓝牙配置文件

 bluetoothManager.getConnectedDevices(BluetoothProfile.GATT_SERVER);

这会失败,因为当设备连接时,android不会连接到GATT服务器,所以设备既不GATT_SERVER也不GATT配置文件。

 bluetoothDevice.connectGatt(getApplicationContext(), false, gattCallback);

设备可以在GATT_SERVER和GATT profile下找到。低能耗设备不支持其他配置文件。

列出配对的设备并尝试在每个设备上连接Gatt

 List<BluetoothDevice> connectedDevices = new ArrayList<BluetoothDevice>();
 for(BluetoothDevice device : bluetoothAdapter.getBondedDevices()) {
      BluetoothGatt gatt = device.connectGatt(getApplicationContext(), false, gattCallback);
      if(gatt != null) {
          connectedDevices.add(device);
      }
      gatt.disconnect();
 }

无法使用此方法,因为它无法确定设备是否已连接或仅在范围内但未连接

在系统引导时,启动服务侦听ACL_CONNECTED和ACL_DISCONNECTED意图,并维护已连接设备的列表

显示

 <service android:name=".ManagerService" android:enabled="true" />
 <receiver
    android:name=".BootFinishedReceiver"
    android:directBootAware="true"
    android:enabled="true"
    android:exported="false"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

接收器

 public class BootFinishedReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
           Intent serviceIntent = new Intent(context, ManagerService.class);
           context.startService(serviceIntent);
      }
  }

服务

 public class ManagerService extends Service {
      private static List<BluetoothDevice> connectedDevices;

      @Override
      public void onCreate() {
          connectedDevices = new ArrayList<BluetoothDevice>();
          super.onCreate();
      }

      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
          IntentFilter filter = new IntentFilter();
          filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
          filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
          registerReceiver(connectionReceiver, filter);
          return super.onStartCommand(intent, flags, startId);
      }

      @Override
      public void onDestroy() {
          unregisterReceiver(connectionReceiver);
          super.onDestroy();
      }

      @Nullable
      @Override
      public IBinder onBind(Intent intent) {
          return null;
      }

      private final BroadcastReceiver connectionReceiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              String action = intent.getAction();
              BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
              if(BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
                  connectedDevices.add(device);
              }else{
                  connectedDevices.remove(device);
              }
          }
      };

      public static List<BluetoothDevice> getConnectedDevices() {
          return connectedDevices;
      }
 }

由于3.1应用程序在活动开始之前无法再接收系统意图,因此也无法使用。

有没有其他方法或如何在以后的android版本中实现它?

谢谢你的建议

共有1个答案

呼延明朗
2023-03-14

嗯,我发现你仍然可以使用ON_BOOT_COMPLETED,但是你必须允许它在你的设备上设置。所以我的问题解决了

 类似资料:
  • ap.connectBLEDevice(OPTION | deviceId, CALLBACK) 连接低功耗蓝牙设备。可直接传入一个字符串作为 OPTION.deviceId。 OPTION 参数说明 名称 类型 必填 描述 deviceId String 是 蓝牙设备 id 错误码说明 error 描述 12 链接失败 代码示例 <script src="https://gw.alipayobj

  • 我是低功耗蓝牙 (LE) API 的新手。有没有办法检查Android设备当前是否连接到任何蓝牙LE设备,并可能获得这些设备的列表? BT-LE设备真的“连接”了吗?我注意到当我的智能手表与我的Nexus 5配对/连接时,状态栏(在KitKat上)中的蓝牙图标不会像连接到经典蓝牙设备时那样变成白色/粗体。 我在经典设备上使用了下面的代码。看起来我可以用相同的方式检查GATT和GATT_SERVER

  • ap.disconnectBLEDevice(OPTION | deviceId, CALLBACK) 断开与低功耗蓝牙设备的连接。可直接传入一个字符串作为 OPTION.deviceId。 OPTION 参数说明 名称 类型 必填 描述 deviceId String 是 蓝牙设备 id 错误码说明 error 描述 12 断开失败 代码示例 <script src="https://gw.al

  • jd.readBLECharacteristicValue(Object object) 读取低功耗蓝牙设备的特征值的二进制数据值。注意:必须设备的特征值支持 read 才可以成功调用。 参数名 类型 默认值 必填 说明 deviceId string 是 蓝牙设备 id serviceId string 是 蓝牙特征值对应服务的 uuid characteristicId string 是 蓝牙

  • 我试图访问Android中低能蓝牙设备的UUID,最终将字符串发布到web API。 以下是我的代码,可以很好地为本地名称和mac地址敬酒: 有人能帮忙吗?

  • ap.readBLECharacteristicValue(OPTION, CALLBACK) 读取低功耗蓝牙设备特征值中的数据。调用后在 ap.onBLECharacteristicValueChange() 事件中接收数据返回。 OPTION 参数说明 名称 类型 必填 描述 deviceId String 是 蓝牙设备 id,参考 device 对象 serviceId String 是 蓝