ACTION_POWER_CONNECTED未通过Intent发送

3

我希望在我的应用中检查手机是通过插座还是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>

ChargingReceiver

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 的第一行总是返回我设定的默认值-1。当我插入或拔出手机时,广播接收器被正确调用,因此我认为意图不包含我尝试查找的Extra。我从这里获取了代码,所以应该可以工作。
我还发现了这个答案,但它对我没有帮助,因为我必须区分USB充电和插座充电。有什么想法我做错了吗?顺便说一句,我已经在Android Nougat上测试了代码。我想在棒棒糖上它已经起作用了,但我不完全确定...
3个回答

1
你在清单文件中注册了 ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED,但这些广播不包含充电状态信息。
要接收有关充电状态的信息,您需要注册 ACTION_BATTERY_CHANGED 广播。从开发人员文档中可以看到:

BatteryManager 在一个粘性 Intent 中广播所有电池和充电细节,包括充电状态。

因此,您可以在 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);

您可以在这里阅读更多相关内容。


哇,这个好使,谢谢!我觉得这不是最好的解决方案,因为我对一个Broadcast做出了一个Broadcast的反应,但由于我无法通过清单文件注册此Intent,目前这是我唯一可用的解决方案,你有什么想法可以美化它吗?或者我对此太过小气了吗? - Cilenco
我认为在你的广播接收器中执行此操作是一个好的解决方案,因为你只想在电源连接状态改变时接收电池状态信息。 - IIIIIIIIIIIIIIIIIIIIII

1

@MarkB 的方法是正确的,它与开发者文档中建议的方法相同。我想指出的是,你不需要注册任何 BroadcastReceiver,因为这是一个粘性意图

基本上,你只需要调用 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_CONNECTEDACTION_POWER_DISCONNECTED,它们用于监视充电状态的变化,并且可以用于处理您可以使用的电池量。


0

试一下这个

        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代码中显式注册ACTION_BATTERY_CHANGED refer


谢谢您的回答,但很抱歉,这个方法也不起作用。 - Cilenco
布尔型变量isCharging的值是什么? - Nas
它总是返回 false - Cilenco
你能告诉我你的状态值吗? - Nas
它始终是“-1”。我在这里找到了这个链接,所以我认为它总是返回“-1”也没问题。我只通过清单文件注册BroadcastReceiver。但“EXTRA_PLUGGED”应该有效… - Cilenco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接