3

ここでちょっとした問題で立ち往生しています。

アプリに何かをさせたいのですが、バッテリーが 10% のときだけです。

私のアプリはバッテリー レベルを常に監視していません。LOW_BATTERY インテントを待つだけです。

レベルを指定しなくても機能しますが、15%、10%、5% の 3 回機能します

私はそれが10%で何かをしたいだけです。

これが私のコードです:

public void onReceive(Context context, Intent intent) 
{
    if(intent.getAction().equals(ACTION_BATTERY_LOW))
    {
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int percent = (level*100)/scale; 

        if(percent == 10)
        {
            // Do Something

        }
    }
}
4

2 に答える 2

6

ACTION_BATTERY_LOWそこから読み込もうとしているエクストラがないため、毎回percent同じようになります。-1

@bimal が示唆したように、これらの ExtrasBroadcastに添付されACTION_BATTERY_CHANGEDます。ただし、それは、代わりにそれを受け取るために登録する必要があるという意味ではありません. ACTION_BATTERY_CHANGEDスティッキーなのでregisterReceiver()、最後のインテントをすぐに返します。つまり、次のようなことができます。

public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals(ACTION_BATTERY_LOW)) {
        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent batteryStatus = context.registerReceiver(null, ifilter);

        int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int percent = (level*100)/scale; 

        if (percent <= 10 && percent > 5) {
            // Do Something
        }
    }
}

これは BroadcastReceiver でregisterReciever()呼び出されたnullため、登録解除について心配する必要はありません。これは、「現在のバッテリーの状態は?」ということを簡潔に伝える良い方法です。(技術的にはブロードキャストが最後に送信されたときの値です。)

于 2012-07-06T11:39:27.157 に答える
3

この場合、「ACTION_BATTERY_CHANGED」を使用できます

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
            int level = intent.getIntExtra("level", 0);
            int scale = intent.getIntExtra("scale", 100);
            double batStatus = level * 100 / scale;
        }
    }

これがあなたを助けることを願っています。

于 2012-06-06T07:35:57.763 に答える