Android实现获取手机的电池电量和充电状态
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、可获取的信息</li><li>二、获取当前电量(无需注册广播)</li><li>三、监听开始充电 / 结束充电(广播方式)</li><li>四、实际可用代码(Kotlin)</li><ul class="second_class_ul"><li>1. 监听充电状态的 BroadcastReceiver</li><li>2. 在 Activity / Service 中注册</li></ul><li>五、Java 写法</li><ul class="second_class_ul"></ul><li>六、注意事项</li><ul class="second_class_ul"></ul><li>七、如果你需要“首次进入页面就知道状态”</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>一、可获取的信息</h2><p>通过 Android 的电池广播,你可以拿到:</p>
<table><thead><tr><th>信息</th><th>说明</th></tr></thead><tbody><tr><td>当前电量 level</td><td>当前电量百分比</td></tr><tr><td>电量最大值 scale</td><td>一般 100</td></tr><tr><td>是否在充电</td><td>AC / USB / 无线充电</td></tr><tr><td>充电开始 / 充电结束</td><td>通过广播监听</td></tr><tr><td>电池健康状态</td><td>good、overheat 等</td></tr><tr><td>电池温度</td><td>部分机型支持</td></tr></tbody></table>
<p class="maodian"></p><h2>二、获取当前电量(无需注册广播)</h2>
<p>Android 推荐方式:</p>
<div class="jb51code"><pre class="brush:java;">val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager
val batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)</pre></div>
<p><code>batteryLevel</code> 即为 <strong>0–100 的电量百分比</strong></p>
<p>兼容 Android 5–16。</p>
<p class="maodian"></p><h2>三、监听开始充电 / 结束充电(广播方式)</h2>
<p>Android 使用以下广播:</p>
<ul><li>ACTION_BATTERY_CHANGED(粘性广播,不需要手动注册)</li><li>ACTION_POWER_CONNECTED—— 插上电源(开始充电)</li><li>ACTION_POWER_DISCONNECTED—— 拔掉电源(停止充电)</li></ul>
<p class="maodian"></p><h2>四、实际可用代码(Kotlin)</h2>
<p class="maodian"></p><h3>1. 监听充电状态的 BroadcastReceiver</h3>
<div class="jb51code"><pre class="brush:java;">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()
}</pre></div>
<p class="maodian"></p><h3>2. 在 Activity / Service 中注册</h3>
<div class="jb51code"><pre class="brush:java;">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)</pre></div>
<p class="maodian"></p><h2>五、Java 写法</h2>
<div class="jb51code"><pre class="brush: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);
}
}
}</pre></div>
<p>注册:</p>
<div class="jb51code"><pre class="brush:java;">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);</pre></div>
<p class="maodian"></p><h2>六、注意事项</h2>
<p>1.无需权限</p>
<p>获取电量/充电状态 <strong>不需要任何危险权限</strong>。</p>
<p>2.ACTION_BATTERY_CHANGED 是粘性广播</p>
<p>不需要手动发送,一调用 <code>registerReceiver()</code> 就能拿到当前电量。</p>
<p>3.Android 10–16 完全兼容</p>
<p>这些电池广播没有废弃,可直接用。</p>
<p class="maodian"></p><h2>七、如果你需要“首次进入页面就知道状态”</h2>
<p>可以用:</p>
<div class="jb51code"><pre class="brush:java;">val intent = Context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))</pre></div>
<p>即可直接拿:</p>
<div class="jb51code"><pre class="brush:java;">val level = intent?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val status = intent?.getIntExtra(BatteryManager.EXTRA_STATUS, -1)</pre></div>
<p>到此这篇关于Android实现获取手机的电池电量和充电状态的文章就介绍到这了,更多相关Android获取手机信息内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>Android实现监听手机开机事件的多种方法</li><li>使用Android获取手机已安装应用程序的不同方法</li><li>Android实现两台手机屏幕共享和远程控制功能</li><li>Android获取手机安装应用程序的详细信息</li><li>Android 获取手机已安装的应用列表实现详解</li><li>Android电量优化提高手机续航</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]