私のプログラムにはブロードキャストレシーバーがあり、次のようにバッテリーレベルに反応します。
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要素がある場合は、バッテリーイベントが発生するのを待つ必要があります。これをナッジして機能させる方法や、単にコードを実行して最後のブロードキャストのバッテリーレベルを確認する方法はありますか?
これをナッジして機能させる方法や、単にコードを実行して最後のブロードキャストのバッテリーレベルを確認する方法はありますか?
IntentFilter
とnull
BroadcastReceiver
を使用してregisterReceiver()
を呼び出して、最後のブロードキャストIntent
を取得できます。これは、ACTION_BATTERY_CHANGED
はいわゆる「スティッキーブロードキャスト」です。これについては、 このStackOverflowの質問と回答 でもう少し説明します。
これは、レシーバーを登録せずにバッテリーレベルを取得する方法です。
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コンポーネントは、インテントを受信するために登録できません
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) + "%";
}
// 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));
}
このメソッドを使用して、更新を受信せずにバッテリーレベルを取得します。
public float getMyBatteryLevel() {
Intent batteryIntent = this.getApplicationContext().registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
return batteryIntent.getIntExtra("level", -1);
}
RegisterReceiver呼び出しから取得する意図に注意してください。
Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
nullでもかまいません。そのため、インテントを使用する前に確認してください。
if(intent != null){
// do your stuff here...
}
Nullポインタ例外が発生したため、アプリがクラッシュしました!