如何取得電池資訊(kotlin)

如何取得電池資訊(kotlin)

如何使用BroadcastReceiver中,我們知道怎麼發出一個廣播, 以及接收一個廣播, 其實在系統中,有很多廣播訊息隨時在傳送, 我們就示範如何抓取電池的廣播當範例。

情境

其實電池會傳送許多的訊息,如電量,溫度,或者目前是否在充電等等,那麼我們就把這些訊息一一列出來。

完整程式碼

如果想觀看完整程式碼,可以到 GitHub 上觀看或下載。

程式碼解說

class MainActivity : AppCompatActivity() {  
 override fun onCreate(savedInstanceState: Bundle?) {  
  super.onCreate(savedInstanceState)  
  setContentView(R.layout.activity_main)  
  registerReceiver(mBroadcastReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))  
 }  

 private val mBroadcastReceiver = object : BroadcastReceiver() {  
  override fun onReceive(p0: Context?, info: Intent?) {  
   if (Intent.ACTION_BATTERY_CHANGED == info?.action) {  
    val level = info.getIntExtra("level", 0)  
    val scale = info.getIntExtra("scale", 0)  
    val status = info.getIntExtra("status", 0)  
    val health = info.getIntExtra("health", 0)  
    val temperature = info.getIntExtra("temperature", 0)  
    val technology = info.getStringExtra("technology")  
    val information = StringBuilder()  
    information.append("Level:$level\n")  
    information.append("Scale:$scale\n")  
    information.append("Battery:$level%\n")  
    when (status) {  
     BatteryManager.BATTERY_STATUS_CHARGING -> information.append("Status:" + "CHARGING" + "\n")  
     BatteryManager.BATTERY_STATUS_DISCHARGING -> information.append("Status:" + "DISCHARGING" + "\n")  
     BatteryManager.BATTERY_STATUS_FULL -> information.append("Status:" + "FULL" + "\n")  
     BatteryManager.BATTERY_STATUS_NOT_CHARGING -> information.append("Status:" + "NOT_CHARGING" + "\n")  
     BatteryManager.BATTERY_STATUS_UNKNOWN -> information.append("Status:" + "UNKNOWN" + "\n")  
    }  
    when (health) {  
     BatteryManager.BATTERY_HEALTH_DEAD -> information.append("Health:" + "DEAD" + "\n")  
     BatteryManager.BATTERY_HEALTH_GOOD -> information.append("Health:" + "GOOD" + "\n")  
     BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE -> information.append("Health:" + "OVER_VOLTAGE" + "\n")  
     BatteryManager.BATTERY_HEALTH_OVERHEAT -> information.append("Health:" + "OVERHEAT" + "\n")  
     BatteryManager.BATTERY_STATUS_UNKNOWN -> information.append("Health:" + "UNKNOWN" + "\n")  
     BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE -> information.append("Health:" + "UNSPECIFIED_FAILURE" + "\n")  
    }  

    information.append("Temperature:" + (temperature * 0.1).toString() + "\n")  
    information.append("Technology:$technology\n")  
    info_text.text = information  
   }  

  }  
 }  

 override fun onPause() {  
  super.onPause()  
  unregisterReceiver(mBroadcastReceiver)  
 }  
}

首先我們在onCreate註冊一個廣播,然後馬上解除註冊廣播, 原因是因為當我們註冊一個廣播以後,抓取的是電池的電量變化, 而電池的電量隨時在變動,因此只要一註冊,就可以馬上抓到電池的訊息。

那我們來看看電池有哪些訊息可以接收,由於我們電池的訊息非常的多種,我就稍微列幾個來作說明,有興趣的可以參考官方網站,最主要的訊息有以下訊息。

Level:        電池目前的電量 以Scale為準
Scale:        電池最大的電量 通常最大為100
Health:       電池的健康狀況 可是使用BatteryManager看常數,Battery_Health_XX就是了
Status:       電池的狀態 可以使用BatteryManager看常數,Battery_Status_XX就是了
Temperature:  電池的溫度 以0.1為單位,因此要乘上0.1
Technology:   電池的類型 例如Li-ion

由於我們的最大電量是100, 而目前電量換成百分比是 目前電量/最大電量*100%
所以剛好就變成 目前電量% 就是百分比了。