ACTION_POWER_CONNECTED 不是按 Intent 发送
ACTION_POWER_CONNECTED not send by Intent
在我的应用程序中,我想检查 phone 是否通过插座或 USB 充电。为此,我使用以下代码创建了一个 BroadcastReceiver
:
清单:
<receiver
android:name=".ChargingReceiver"
android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
充电接收器
public void onReceive(Context context, Intent intent) {
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB);
//...
}
我的问题是,ChargingReceiver
的第一行总是 return -1
这是我设置的默认值。当我插入或拔出我的 phone 时,BroadcastReceiver 被正确调用,因此在我看来,意图不包含我尝试查找的 Extra
。我有来自 here 的代码,所以它应该可以工作。
我也找到了 答案,但它对我没有帮助,因为我必须区分 USB 充电和插座充电。任何想法我做错了什么?顺便说一句,我已经用 Android Nougat 测试了代码。我认为它在 Lollipop 上有效,但我不完全确定...
试试这个
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
根据@MarkB 的建议,您必须从 Java 代码 refer
中明确注册 ACTION_BATTERY_CHANGED
您在清单中注册了 ACTION_POWER_CONNECTED
和 ACTION_POWER_DISCONNECTED
。但是这些广播不包含有关充电状态的信息。
为了接收有关充电状态的信息,您需要注册 ACTION_BATTERY_CHANGED
广播。来自开发者文档:
The BatteryManager broadcasts all battery and charging details in a
sticky Intent that includes the charging status.
因此您可以在 onReceive
中尝试以下代码片段:
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean pluggedAC = (plugged == BatteryManager.BATTERY_PLUGGED_AC);
boolean pluggedUSB = (plugged == BatteryManager.BATTERY_PLUGGED_USB);
您可以阅读更多相关内容here
@MarkB 方法是正确的,它与开发人员文档中建议的方法相同。我想指出您不需要注册任何 BroadcastReceiver
因为那是 Sticky Intent.
基本上您需要做的就是调用 registerReceiver
传递 null 作为接收者,当然还有操作 (Intent.ACTION_BATTERY_CHANGED
):
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
然后你可以这样做:
// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
(这些片段不是我的,而是来自文档)
请注意,按照文档的建议,这样做没有任何问题。
现在,回到您的代码,您实际上正在监听 ACTION_POWER_CONNECTED
和 ACTION_POWER_DISCONNECTED
,它们用于监控充电状态的变化,并且可以对于处理您可以使用的电池电量很有用。
在我的应用程序中,我想检查 phone 是否通过插座或 USB 充电。为此,我使用以下代码创建了一个 BroadcastReceiver
:
清单:
<receiver
android:name=".ChargingReceiver"
android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
充电接收器
public void onReceive(Context context, Intent intent) {
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB);
//...
}
我的问题是,ChargingReceiver
的第一行总是 return -1
这是我设置的默认值。当我插入或拔出我的 phone 时,BroadcastReceiver 被正确调用,因此在我看来,意图不包含我尝试查找的 Extra
。我有来自 here 的代码,所以它应该可以工作。
我也找到了
试试这个
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
根据@MarkB 的建议,您必须从 Java 代码 refer
中明确注册 ACTION_BATTERY_CHANGED您在清单中注册了 ACTION_POWER_CONNECTED
和 ACTION_POWER_DISCONNECTED
。但是这些广播不包含有关充电状态的信息。
为了接收有关充电状态的信息,您需要注册 ACTION_BATTERY_CHANGED
广播。来自开发者文档:
The BatteryManager broadcasts all battery and charging details in a sticky Intent that includes the charging status.
因此您可以在 onReceive
中尝试以下代码片段:
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean pluggedAC = (plugged == BatteryManager.BATTERY_PLUGGED_AC);
boolean pluggedUSB = (plugged == BatteryManager.BATTERY_PLUGGED_USB);
您可以阅读更多相关内容here
@MarkB 方法是正确的,它与开发人员文档中建议的方法相同。我想指出您不需要注册任何 BroadcastReceiver
因为那是 Sticky Intent.
基本上您需要做的就是调用 registerReceiver
传递 null 作为接收者,当然还有操作 (Intent.ACTION_BATTERY_CHANGED
):
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
然后你可以这样做:
// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
(这些片段不是我的,而是来自文档)
请注意,按照文档的建议,这样做没有任何问题。
现在,回到您的代码,您实际上正在监听 ACTION_POWER_CONNECTED
和 ACTION_POWER_DISCONNECTED
,它们用于监控充电状态的变化,并且可以对于处理您可以使用的电池电量很有用。