You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android行车记录仪充满电仍插电时,如何准确判断供电状态?

问题分析与解决方案

你遇到的问题确实存在——部分安卓设备在电池充满后,即使USB仍连接电源,系统也会触发Intent.ACTION_POWER_DISCONNECTED广播,这是厂商电源管理策略(比如切换到涓流充电模式)导致的误触发,仅靠这两个广播无法准确判断真实的电源连接状态。

你提出的方案完全可行,且更可靠

使用Intent.ACTION_BATTERY_CHANGED广播是判断电源连接状态的正确方式,原因如下:

  • 这是系统持续发送的实时广播,能准确反映当前电池和电源的真实状态,不受厂商充电策略的干扰;
  • 通过BatteryManager.EXTRA_PLUGGED字段可以直接判断设备是否连接电源:该字段值为0时代表未连接,非0时(1=AC充电、2=USB充电、4=无线充电,不同厂商可能有扩展值)代表已连接电源。

注意事项与优化建议

  1. 必须动态注册广播:ACTION_BATTERY_CHANGED不支持在AndroidManifest.xml中静态注册,只能在代码中通过registerReceiver动态注册,记得在组件销毁时调用unregisterReceiver注销,避免内存泄漏。
  2. 避免频繁启停:由于该广播会频繁触发(比如电池电量变化时也会发送),建议维护一个状态变量记录当前录制状态,只有当电源状态变化且与录制状态不符时,才执行启停操作。

优化后的代码示例

// 记录当前录制状态,避免重复操作
private var isRecording = false

// 定义电池状态广播接收器
private val batteryStatusReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        intent ?: return
        // 判断是否连接电源
        val isPowerConnected = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0

        // 根据状态执行启停逻辑
        if (isPowerConnected && !isRecording) {
            startRecording()
            isRecording = true
        } else if (!isPowerConnected && isRecording) {
            stopRecording()
            isRecording = false
        }
    }
}

// 在组件初始化时注册广播(比如Activity的onCreate、Service的onCreate)
fun registerBatteryReceiver(context: Context) {
    val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
    context.registerReceiver(batteryStatusReceiver, filter)
}

// 在组件销毁时注销广播(比如Activity的onDestroy、Service的onDestroy)
fun unregisterBatteryReceiver(context: Context) {
    context.unregisterReceiver(batteryStatusReceiver)
}

这样就能彻底解决充满电后误停止录制的问题,确保只要物理上连接电源,录制就会持续进行。

内容的提问来源于stack exchange,提问作者user924

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:50:47