web-dev-qa-db-ja.com

ブロードキャストレシーバーがIntent.ACTION_BATTERY_CHANGEDに応答する前にバッテリーレベルを取得します

私のプログラムにはブロードキャストレシーバーがあり、次のようにバッテリーレベルに反応します。

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要素がある場合は、バッテリーイベントが発生するのを待つ必要があります。これをナッジして機能させる方法や、単にコードを実行して最後のブロードキャストのバッテリーレベルを確認する方法はありますか?

41
stealthcopter

これをナッジして機能させる方法や、単にコードを実行して最後のブロードキャストのバッテリーレベルを確認する方法はありますか?

IntentFilternullBroadcastReceiverを使用してregisterReceiver()を呼び出して、最後のブロードキャストIntentを取得できます。これは、ACTION_BATTERY_CHANGEDはいわゆる「スティッキーブロードキャスト」です。これについては、 このStackOverflowの質問と回答 でもう少し説明します。

37
CommonsWare

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

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コンポーネントは、インテントを受信するために登録できません

84
isdal
    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) + "%";
    }
5
XXX
// 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));
}
2
Hiren Patel

このメソッドを使用して、更新を受信せずにバッテリーレベルを取得します。

public float getMyBatteryLevel() {
        Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
        new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        return batteryIntent.getIntExtra("level", -1);
}
1
Jorgesys

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

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

nullでもかまいません。そのため、インテントを使用する前に確認してください。

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

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

0
Johan