Как получить уровень заряда батареи 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())
}