Как получить уровень заряда батареи Bluetooth-гарнитуры?

Я пытаюсь создать приложение, которое получает уровень заряда батареи подключенной в данный момент гарнитуры Bluetooth. Это приложение может использоваться на телефонах, которые не имеют этой встроенной функции.
При поиске на stackru, я нашел, как получить состояние батареи гарнитуры Bluetooth в Android этот вопрос. Я получил подключенную Bluetooth-гарнитуру, используя BluetoothProfile.HEADSET профиль.
Но в устройстве объект типа BluetoothDevice Я не вижу какой-либо метод или свойство, чтобы получить уровень заряда батареи Bluetooth-гарнитуры.
Я могу получить имя устройства и isAudioConnected,

6 ответов

Я нашел решение, но оно работает только на android 8 и выше

Я взял этот код отсюда

Котлин

 fun getBatteryLevel(pairedDevice: BluetoothDevice?): Int {
    return pairedDevice?.let { bluetoothDevice ->
        (bluetoothDevice.javaClass.getMethod("getBatteryLevel"))
            .invoke(pairedDevice) as Int
    } ?: -1
}

Если вопрос касается функции Bluetooth HFP: функция индикаторов HF является дополнительной для обеих сторон. Если обе стороны поддерживают это, BluetoothHeadset будет транслироваться BluetoothHeadset.ACTION_HF_INDICATORS_VALUE_CHANGED с BluetoothHeadset.EXTRA_HF_INDICATORS_IND_ID равно 2 (уровень заряда батареи) и BluetoothHeadset.EXTRA_HF_INDICATORS_IND_VALUE с областью 0..100. Не помню версию Android, где она была реализована, вы должны проверить это.

Также уровень заряда батареи может быть реализован в устройстве с использованием специальных команд HFP AT (особенно для старых устройств громкой связи) и, возможно, BLE.

Первым делом зарегистрировать BroadcastReciver с помощью "android.bluetooth.device.action.BATTERY_LEVEL_CHANGED"

и вы можете получить это действие от широковещательного приемника, а затем получить дополнительные данные с помощью "android.bluetooth.device.extra.BATTERY_LEVEL"

и если вы хотите запустить это действие, вам необходимо повторно подключить устройство Bluetooth или уровень заряда батареи устройства Bluetooth изменился.

Удачи тебе.

Я могу достичь уровня заряда батареи телефона в Java

         try {                      
          BluetoothDevice device = bluetoothAdapter.getRemoteDevice("Connected device ID");
          java.lang.reflect.Method method;
          method = device.getClass().getMethod("getBatteryLevel");
          int value = (int) method.invoke(device);
          result.success(value);
       } catch (Exception ex) {
          result.error("invalid_argument", "'deviceId' argument is required to be string", null);
          break;
       }

Подключил AirPods Pro к OnePlus 5T с Android 9. Ни одно из этих зарегистрированных событий не произошло:

"android.bluetooth.device.action.BATTERY_LEVEL_CHANGED"
"android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED"
"android.bluetooth.headset.action.HF_INDICATORS_VALUE_CHANGED"

Это ответ @Kirill Martyuk как переменная расширения

      val BluetoothDevice.batteryLevel
    get() = this.let { device ->
        val method = device.javaClass.getMethod("getBatteryLevel")
        method.invoke(device) as Int?
      } ?: -1

Использование будет примерно таким

      val manager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager?
val adapter = manager?.adapter
val devices = adapter?.bondedDevices.orEmpty()
devices.forEach { device ->
    Log.d("DEVICE_NAME", device.name)
    Log.d("CHARGE_LEVEL", device.batteryLevel.toString())
}
Другие вопросы по тегам