バッテリーのLOW状態の監視

Android端末ではバッテリーがLOW状態(バッテリー残量が15%以下)のとき、充電するようにダイアログが表示されると思います。

アプリによってはLOW状態とそうでないときで処理を変えた方がいいこともあるので、2つの状態を受け取る方法を紹介します。

ここではLOW状態の時とバッテリーが充電されたことを受け取る2つのレシーバーを作って実際にエミュレーターでバッテリーの残量を変化させてみます。

実際の手順は次のようになります。

  1. LOW状態を受け取るレシーバーを作る
  2. LOW状態から回復したことを受け取るレシーバーを作る
  3. マニフェストに権限の追加

バッテリーがLOWになっていることを受信するレシーバー

まずバッテリーの残量がLOWになっているときに起動されるレシーバークラスをBroadcastReceiverを使って作ります。

package com.MyApp.myapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**バッテリー残量がLOWになったことを受信するレシーバー*/
public class BatteryLowReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d("BatteryLowReceiver : ", "バッテリー残量 LOW");
    }
}

バッテリーがLOWになったらonReceiveが実行されます。

ただし、この時点では定義しただけなので動きません。

バッテリーが回復したことを受信するレシーバー

次にバッテリーがLOWから回復またはLOW状態で充電されたことを受信するレシーバーを作ります。

作り方はLOW状態の時と同じです。

package com.MyApp.myapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**バッテリー残量がOKになったことを受信するレシーバー*/
public class BatteryOKReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Log.d("BatteryOKReceiver : ", "バッテリー残量OK");
    }
}

これもただ定義しているだけなので動きません。

そこでAndroidManifestに今作った2つのレシーバーを追加します。

マニフェストファイルへのレシーバーの追加

レシーバーが受信することができるようにAndroidManifest.xmlを開いてapplication要素の中に次の2つのレシーバー要素を追加します。

<!-- バッテリーがOKになったことを受信するレシーバー -->
<receiver android:name="com.MyApp.myapp.BatteryOKReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_OKAY"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

<!-- バッテリーがLOWになったことを受信するレシーバー -->
<receiver android:name="com.MyApp.myapp.BatteryLowReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_LOW"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

intent-filter要素のなかのaction要素に受け取りたいアクション名を書きます。

バッテリーがOKになったことを知らせるアクション名は"android.intent.action.BATTERY_OKAY"で、LOWになったことを受信するアクション名は"android.intent.action.BATTERY_LOW"です。

バッテリー残量のシミュレート

最後に実際にレシーバーがうまく動くか確かめてみます。

まずコマンドプロンプトを開いて、telnet経由でエミュレーターに接続します。

telnet localhost 5554

5554が接続に使うポート番号です。

もし接続できないときはポート番号が違うのでエミュレーターのタイトルバーに表示されている4桁の数字に変えてください。

無事接続できたらtelnetからバッテリーが充電されていない状態を作り出したいので次のコマンドを打ちます。

power ac off

これで充電されていないことと同じになります。

そして次にバッテリーをLOWにするためにバッテリー残量を15%未満にします。

power capacity 10

するとバッテリーを充電するように警告するダイアログが表示されます。

バッテリーがLOWになっていることを知らせるダイアログ

このダイアログが表示された瞬間にACTION_BATTERY_LOWが送信されます。

もしバッテリーがOK状態のときもシュミレートしたければ次の3つのコマンドを打ちます。

power ac on
power capacity 100
power ac off

いろいろ試してみるとACTION_BATTERY_OKEYが送信される条件はいったんLOW状態から回復してから充電機器が外されることらしいです。

なので上のコマンドでは一旦AC充電をONにしてからバッテリー残量を100%にして、それからAC充電をOFFにしています。

関連項目
プライバシーポリシー