与其他许多人一样,我正在尝试创建一个简单的应用程序,每次手机连接或与充电器断开连接时都会记录条目。我计划使用这些数据来计算几周/几个月的平均充电和放电率,以了解电池在一段时间内的表现。
我在ACTION_POWER_CONNECTED
和ACTION_POWER_DISCONNECTED
的清单中声明了Intent过滤器,它们似乎正常运行。
现在,当他们被解雇时,我正在注册接收ACTION_BATTERY_CHANGED
以获取电池EXTRA_LEVEL
,EXTRA_STATUS
和EXTRA_PLUGGED
。 (参考 - Obtaining usb cable plugged IN/OUT event using EXTRA_PLUGGED does not work)
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intentPowerConn) {
Intent intentBatChange = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int chargeStatus = intentBatChange.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
int chargeType = intentBatChange.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
int chargeLevel = intentBatChange.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
Toast.makeText(context, chargeStatus + " " + chargeType + " " + chargeLevel, Toast.LENGTH_SHORT).show();
}
}
但是,此粘性广播返回的EXTRA_STATUS
在电话连接后立即触发时仍显示为“放电”。其他额外内容(例如EXTRA_PLUGGED
和EXTRA_LEVEL
)会返回正确的值。
连接后手动刷新以获取ACTION_BATTERY_CHANGED
操作会将STATUS
恢复为正常收费。
连接后立即收到的意图是陈旧的,因为EXTRA_PLUGGED
返回正确的类型(AC或USB)。
我有一个解决方法,我使用ACTION_POWER_CONNECTED/ACTION_POWER_DISCONNECTED
意图操作来确定充电状态(如此处所述 - How to detect power connected state?)。
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context , Intent intentPowerConn) {
Intent intentBatChange = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int chargeStatus = intentBatChange.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
int chargeType = intentBatChange.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
int chargeLevel = intentBatChange.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
String action = intentPowerConn.getAction();
boolean chargeFlag = false;
if(action.equals(Intent.ACTION_POWER_CONNECTED)) {
chargeFlag = true;
}
else if(action.equals(Intent.ACTION_POWER_DISCONNECTED)) {
chargeFlag = false;
}
Toast.makeText(context, chargeStatus + " " + chargeType + " " + chargeLevel + " " + chargeFlag, Toast.LENGTH_SHORT).show();
}
}
我可能需要将STATUS
用于BATTERY_STATUS_FULL
,BATTERY_STATUS_NOT_CHARGING
和BATTERY_STATUS_UNKNOWN
等其他方案。
所以我不想依赖意图。ACTION_POWER_CONNECTED
行动。
鉴于此,检测当前充电状态的可靠方法是什么?
我正在考虑在注册ACTION_BATTERY_CHANGED intent;
之前加上2秒的延迟,虽然我尚未对其进行测试,但我认为它可能会有效。