Androidで"android.intent.action.BATTERY_LOW"が呼ばれる閾値の取得方法

長らくご無沙汰してました,生きてます。

どうにも「ちゃんとした(長い)記事を書こう」と思って機を狙いすぎて放置してしまう嫌いがあるようなので,今回は軽いTipsだけをちゃちゃっと更新するにとどめようと思う。

android.intent.action.BATTERY_LOWとは

android.intent.action.BATTERY_LOWというのは,Android端末でバッテリ残量が「ある値」以下になったら発行されるOSのブロードキャスト。

screenshot_2014-06-18-08-27-20

だいたいの端末では15%を切ると(つまり14%になると),上のようなシステムアラートが出ると思う。

この閾値(=15)をプログラム上から取得する方法があるので書いておこうと思った次第。あまり意味はないかもしれないけど,アプリUI上で「バッテリ残量が少なくなったとき」と曖昧に書かれるよりも「15%以下になったとき」と書かれた方がいいかもしれないよね。

失敗例

IDEの補完機能を使いまくって良さげなメソッドがないか探してみたが,ない。となるとリソースかしら。

context.getResources().getInteger(com.android.internal.R.integer.config_lowBatteryWarningLevel);

そう思って色々調べてみると,上のようなコードが見つかった。確かに,一見良さそうに見える(IDEではコードの補完も効く)。しかし,実際に実行してみると”com.android.internal.R”でエラーが出てくる。

何故か。Androidの内部がどうなってるのかわからないが,恐らくpublicに使えないリソースなのだろう。

成功例

でもリソース名までわかってるならやりようはある。@hideなメソッドといい,Androidはそこらへん融通訊くのがとても楽しい。

try {
  int lowBatteryWarningLevelId = Resources.getSystem().getIdentifier("config_lowBatteryWarningLevel", "integer", "android");
  int lowThreshold = Resources.getSystem().getInteger(lowBatteryWarningLevelId);
} catch (Exception e) {
  e.printStackTrace();
}

上のように書けばその閾値は取得できる。

“config_lowBatteryWarningLevel”なんて文字列を直で打つのがとてつもなく怖いので,一応try-catchしておいた方が無難。もし「internalにそんなリソースないよ!」って場合にはlowBatteryWarningLevelIdに0が入る。だから具体的にはそのあとのgetSystem().getInteger()でエラー出るんだけど,まあ全体にtryかけた方がいいだろう。

色んなページを参考にしたが(一番下に挙げておく),日本語の文章はなかったので誰かの役に立てば幸い。

おまけ

android.intent.action.BATTERY_LOWのBroadcastをreceiveして何かを実行したいとき,まさかわざわざBroadcast発行を待つわけにはいかない。便利なことに,adbでintentを発行する方法があるらしいのでシェアしておく。

みんな大好きTech Boosterに,丁度BATTERY_LOWでやっているページがあったので,参考にされたし。→「ターミナルからIntentを投げる」
(できるはずなのだが,私の環境下では正しくbroadcastが発行されなかった……)

参考

色々webサイトを旅行して上記に辿り着いた。ネットの海最高。