42

私のプログラムには、次のようにバッテリーレベルに反応する放送受信機があります。

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent intent) {
        int level = intent.getIntExtra("level", 0);
        // do something...
    }
}

    registerReceiver(this.mBatInfoReceiver, 
            new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

ただし、このコードはバッテリーステータスが更新されるのを待つ必要があるため、バッテリーレベルに基づいて設定する必要のあるGUI要素がある場合は、バッテリーイベントが発生するのを待つ必要があります。これを微調整して機能させる方法や、コードを実行して最後のブロードキャストのバッテリーレベルを確認する方法はありますか?

4

6 に答える 6

84

これは、受信機を登録せずにバッテリーレベルを取得する方法です。

Intent batteryIntent = context.getApplicationContext().registerReceiver(null,
                    new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int rawlevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
double scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
double level = -1;
if (rawlevel >= 0 && scale > 0) {
    level = rawlevel / scale;
}

ブロードキャストのスティッキーな性質のため、nullのBroadcastReceiverを使用できます。

インテントレシーバーにいて例外が発生した場合に備えて、getApplicationContext()トリックを使用します。

android.content.ReceiverCallNotAllowedException:IntentReceiverコンポーネントは、インテントを受信するために登録できません

于 2010-10-28T22:57:13.743 に答える
37

これを微調整して動作させる方法や、単純にコードを実行して前回の放送でのバッテリー レベルを確認する方法はありますか?

registerReceiver()yourIntentFilterと aで呼び出してnull BroadcastReceiver、 last-broadcast を取得できますIntent。これACTION_BATTERY_CHANGEDは、いわゆる「スティッキー ブロードキャスト」であるため機能します。これについては、この StackOverflow question-and-answerでもう少し説明します。

于 2010-09-07T19:19:01.907 に答える
6
    public static String batteryLevel(Context context)
    {
        Intent intent  = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));   
        int    level   = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        int    scale   = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
        int    percent = (level*100)/scale;
        return String.valueOf(percent) + "%";
    }
于 2014-05-12T16:31:11.130 に答える
2
// Put this Code into your MainActivity

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context c, Intent i) {
        int level = i.getIntExtra("level", 0);
        ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);
        pb.setProgress(level);
        TextView tv = (TextView) findViewById(R.id.textfield);
        tv.setText("Battery Level: " + Integer.toString(level) + "%");
    }

};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    registerReceiver(mBatInfoReceiver, new IntentFilter(
            Intent.ACTION_BATTERY_CHANGED));
}
于 2013-04-23T10:14:33.200 に答える
0

registerReceiver 呼び出しから取得する意図に注意してください。

Intent intent  = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

null にすることができます。そのため、インテントを使用する前に確認してください。

if(intent != null){ 
// do your stuff here... 
}

null ポインター例外が発生したため、アプリがクラッシュしました。

于 2016-08-24T12:46:20.810 に答える