Android實(shí)現(xiàn)獲取手機(jī)的電池電量和充電狀態(tài)
一、可獲取的信息
通過 Android 的電池廣播,你可以拿到:
| 信息 | 說明 |
|---|---|
| 當(dāng)前電量 level | 當(dāng)前電量百分比 |
| 電量最大值 scale | 一般 100 |
| 是否在充電 | AC / USB / 無線充電 |
| 充電開始 / 充電結(jié)束 | 通過廣播監(jiān)聽 |
| 電池健康狀態(tài) | good、overheat 等 |
| 電池溫度 | 部分機(jī)型支持 |
二、獲取當(dāng)前電量(無需注冊廣播)
Android 推薦方式:
val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager val batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
batteryLevel 即為 0–100 的電量百分比
兼容 Android 5–16。
三、監(jiān)聽開始充電 / 結(jié)束充電(廣播方式)
Android 使用以下廣播:
- ACTION_BATTERY_CHANGED(粘性廣播,不需要手動(dòng)注冊)
- ACTION_POWER_CONNECTED—— 插上電源(開始充電)
- ACTION_POWER_DISCONNECTED—— 拔掉電源(停止充電)
四、實(shí)際可用代碼(Kotlin)
1. 監(jiān)聽充電狀態(tài)的 BroadcastReceiver
class BatteryReceiver(private val callback: (BatteryEvent) -> Unit) : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
Intent.ACTION_POWER_CONNECTED -> {
callback(BatteryEvent.ChargeStart)
}
Intent.ACTION_POWER_DISCONNECTED -> {
callback(BatteryEvent.ChargeStop)
}
Intent.ACTION_BATTERY_CHANGED -> {
val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100)
val status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL
val percent = level * 100 / scale
callback(BatteryEvent.BatteryInfo(percent, isCharging))
}
}
}
}
sealed class BatteryEvent {
data object ChargeStart : BatteryEvent()
data object ChargeStop : BatteryEvent()
data class BatteryInfo(val level: Int, val isCharging: Boolean) : BatteryEvent()
}2. 在 Activity / Service 中注冊
val receiver = BatteryReceiver { event ->
when (event) {
is BatteryEvent.ChargeStart -> Log.d("Battery", "開始充電")
is BatteryEvent.ChargeStop -> Log.d("Battery", "停止充電")
is BatteryEvent.BatteryInfo -> Log.d("Battery", "電量=${event.level}%, 是否充電=${event.isCharging}")
}
}
val filter = IntentFilter().apply {
addAction(Intent.ACTION_BATTERY_CHANGED)
addAction(Intent.ACTION_POWER_CONNECTED)
addAction(Intent.ACTION_POWER_DISCONNECTED)
}
registerReceiver(receiver, filter)五、Java 寫法
public class BatteryReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_POWER_CONNECTED.equals(action)) {
Log.d("Battery", "開始充電");
} else if (Intent.ACTION_POWER_DISCONNECTED.equals(action)) {
Log.d("Battery", "停止充電");
} else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int percent = level * 100 / scale;
Log.d("Battery", "電量=" + percent + "% 是否充電=" + isCharging);
}
}
}注冊:
IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_POWER_CONNECTED); filter.addAction(Intent.ACTION_POWER_DISCONNECTED); registerReceiver(new BatteryReceiver(), filter);
六、注意事項(xiàng)
1.無需權(quán)限
獲取電量/充電狀態(tài) 不需要任何危險(xiǎn)權(quán)限。
2.ACTION_BATTERY_CHANGED 是粘性廣播
不需要手動(dòng)發(fā)送,一調(diào)用 registerReceiver() 就能拿到當(dāng)前電量。
3.Android 10–16 完全兼容
這些電池廣播沒有廢棄,可直接用。
七、如果你需要“首次進(jìn)入頁面就知道狀態(tài)”
可以用:
val intent = Context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
即可直接拿:
val level = intent?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) val status = intent?.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
到此這篇關(guān)于Android實(shí)現(xiàn)獲取手機(jī)的電池電量和充電狀態(tài)的文章就介紹到這了,更多相關(guān)Android獲取手機(jī)信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開發(fā)自定義控件之折線圖實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Android開發(fā)自定義控件之折線圖實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Android自定義控件中折線圖原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
android常見手動(dòng)和自動(dòng)輪播圖效果
這篇文章主要為大家詳細(xì)介紹了android常見手動(dòng)和自動(dòng)輪播圖效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Android實(shí)現(xiàn)簡單MD5加密的方法
這篇文章主要介紹了Android實(shí)現(xiàn)簡單MD5加密的方法,涉及Android編碼操作及加密的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08
android 解決ViewPager加載大量圖片內(nèi)存溢出問題
本篇文章是介紹 android 解決ViewPager加載大量圖片內(nèi)存溢出問題,并附有代碼實(shí)例,希望能幫到有需要的小伙伴2016-07-07
Android本地驗(yàn)證碼的簡易實(shí)現(xiàn)方法(防止暴力登錄)
驗(yàn)證馬真是無處不在啊,主要作用是防止惡意暴力破解登錄,這篇文章主要介紹了Android本地驗(yàn)證碼的簡易實(shí)現(xiàn)方法(防止暴力登錄),需要的朋友可以參考下2017-04-04
通過實(shí)例簡單講解Android App中的Activity組件
這篇文章主要介紹了通過Android App中的Activity組件,包括Activity的定義和繼承以及啟動(dòng)等基本知識,需要的朋友可以參考下2016-04-04
Android開發(fā)必知 九種對話框的實(shí)現(xiàn)方法
App中少不了與用戶交互的各種dialog,以此達(dá)到很好的用戶體驗(yàn),下面給大家介紹Android開發(fā)必知 九種對話框的實(shí)現(xiàn)方法,有需要的朋友可以參考下2015-08-08
android開發(fā)基礎(chǔ)教程—打電話發(fā)短信
打電話發(fā)短信的功能已經(jīng)離不開我們的生活了,記下來介紹打電話發(fā)短信的具體實(shí)現(xiàn)代碼,感興趣的朋友可以了解下2013-01-01

