ACTION_POWER_CONNECTED出现问题

时间:2012-04-18 14:31:38

标签: android

我正在使用我应用中以下示例页面中的代码来监控设备连接/断开电源适配器的时间:

http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

所以我在我的清单中:

    <receiver android:name=".StatusChangeReceiver">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
        </intent-filter>
    </receiver>

我的班级看起来像这样:

public class StatusChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    boolean isActive = prefs.getBoolean("isActive", false);
    if (isActive){
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
        // Do somthing with isCharging here
    }

}

但无论电源是连接还是断开,isCharging始终为false。我显然在调试时遇到问题,因为我必须保持(不)连接USB线以使事件发生。

我认为当电源连接时,事件被触发并且在我的代码运行之前状态没有更新,但我不确定解决它的最佳方法。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

我遇到了与其他人一样的问题。我的解决方案是在ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED广播接收器中调用ACTION_BATTERY_CHANGED阻塞意图:

在onCreate或其他一些适当的初始化程序中:

    // register our power status receivers
    IntentFilter powerConnectedFilter = new IntentFilter(Intent.ACTION_POWER_CONNECTED);
    registerReceiver(PowerStatusReceiver, powerConnectedFilter);

    IntentFilter powerDisconnectedFilter = new IntentFilter(Intent.ACTION_POWER_DISCONNECTED);
    registerReceiver(PowerStatusReceiver, powerDisconnectedFilter);

定义我们的BroadcastReceiver并在其中嵌入BATTERY_STATUS请求:

BroadcastReceiver PowerStatusReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        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);
        isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;
    }
};  

此外,使用这种方法,您不必在清单中定义接收器......但这最终完全由您决定,具体取决于您的用例需求。

答案 1 :(得分:0)

此处还解释了:battery status on ACTION_POWER_CONNECTED

我遇到了同样的问题,并且太快地打电话或检查电池状态。在ACTION_BATTERY_CHANGED更新之前调用ACTION_POWER_CONNECTED,因此可能使用AlarmManager安排自己在几秒钟内再次唤醒,然后再次检查。   两秒钟,在我的测试中还不够长......

答案 2 :(得分:0)

您也可以BatteryManager.EXTRA_PLUGGED

查看
public boolean isChargingmy(Context context)
    {
        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent batteryStatus = context.getApplicationContext().registerReceiver(null, ifilter);
        boolean bCharging=false;
        if(batteryStatus != null){

            int plugged = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
            Log.e("plugged","plugged:"+plugged);
            bCharging= plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
            Log.e("bCharging","bCharging:"+bCharging);
        }
        else{
            Log.e("batteryStatus","batteryStatus:"+null);
        }

        return bCharging;
    }

我在BroadcastReceiver内注册了接收器,所以我用过了 context.getApplicationContext().registerReceiver()。仅当您未在context.registerReceiver()

上注册时,才必须使用BroadcastReceiver

答案 3 :(得分:0)

我遇到同样的问题,但是看看使用intent.getAction()的意图动作是什么,广播会收到预期的信息:

I/POWER: android.intent.action.ACTION_POWER_DISCONNECTED   
I/POWER: android.intent.action.ACTION_POWER_CONNECTED

所以在我的情况下,我在代码中需要的只是因为我知道电缆何时连接/断开。请记住,使用此功能意味着您只收到了这些事件,而不是其他与电池相关的事件,就像使用ACTION_BATTERY_CHANGED一样。