Android Kotlin: How to get battery voltage programmatically

Android Kotlin: Programmatically Get Battery Voltage

This code demonstrates how to retrieve the battery voltage level in volts on an Android device using Kotlin. It utilizes the Android Broadcast system to listen for battery level changes and extract the voltage information.

Code Breakdown:

  1. Broadcast Receiver:

    • A BroadcastReceiver subclass is defined to capture battery level updates.
    • The onReceive method gets called whenever the battery level changes.
  2. Extracting Voltage:

    • Inside onReceive, the intent's extra value for BatteryManager.EXTRA_VOLTAGE is retrieved in millivolts (mV).
  3. Converting to Volts:

    • An extension property toVolts is defined for Int.
    • It converts the millivolt value to volts by dividing by 1000.
    • A DecimalFormat object is used to format the voltage with one decimal place and round it up using RoundingMode.CEILING.
  4. Activity & UI:

    • The MainActivity class extends AppCompatActivity and handles the UI.
    • An IntentFilter is created to listen for the Intent.ACTION_BATTERY_CHANGED broadcast.
    • The receiver instance is registered in onCreate to start listening for battery updates.
    • The textView in the layout displays the formatted battery voltage.

Summary

This code provides a way to programmatically access and display the battery voltage level on an Android device. It leverages the Android Broadcast system to stay updated on battery level changes and performs unit conversion and formatting for a user-friendly presentation.

This approach is beneficial for applications that require detailed battery information beyond the standard percentage level. However, keep in mind that battery voltage access may not be available on all devices or Android versions.


MainActivity.kt

package com.example.jetpack

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.math.RoundingMode
import java.text.DecimalFormat


class MainActivity : AppCompatActivity() {

    // initialize a new broadcast receiver instance
    private val receiver:BroadcastReceiver = object: BroadcastReceiver(){
        override fun onReceive(context: Context?, intent: Intent?) {
            // get battery voltage in Millivolts from intent
            val voltage = intent?.getIntExtra(
                BatteryManager.EXTRA_VOLTAGE, 0
            )

            voltage?.apply {
                // show the battery voltage in volts
                textView.text = "Battery Voltage\n\n$toVolts"
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // initialize a new intent filter instance
        val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)

        // register the broadcast receiver
        registerReceiver(receiver,filter)
    }
}


// extension property to convert milli volts to volts
val Int.toVolts:String
    get() {
        // convert Millivolts to Volts
        val volts = this * 0.001

        // initialize a new decimal format instance
        val decimalFormat = DecimalFormat("#.#")

        // round the number using decimal format
        decimalFormat.roundingMode = RoundingMode.CEILING

        // format the decimal value to one decimal position
        return "${decimalFormat.format(volts)} Volts"
    }
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/constraintLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EDEAE0"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-condensed"
        android:gravity="center"
        android:padding="32dp"
        android:textColor="#0014A8"
        android:textSize="35sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.25"
        tools:text="TextView" />

</androidx.constraintlayout.widget.ConstraintLayout>
More android kotlin tutorials