スマホアプリならアンドロック
スマホアプリ(アンドロイド)レビューやスマホ情報はアンドロック
今回はAndRockで開発した『ゆるキャラ育成ゲーム的な「ガリレオ」』を例に、アンドロイドアプリの開発情報を紹介します。
どのようにバッテリー情報を取得して表示する文言や画像に反映しているかの解説を行いたいと思います。
バッテリー残量によってイラストと台詞が変更されるウィジェットです。
主な処理としては、起動したService内で以下の二点を行っています。
ACTION_BATTERY_CHANGEDアクションを追加することにより、バッテリー情報の変更を取得できるようになります。
情報の取得とそれに伴う処理はmBroadcastReceiverで行います。
public void onStart(Intent intent, int startId){ super.onStart(intent, startId); //インテントフィルタの登録 IntentFilter filter = new IntentFilter(); //インテントフィルタへACTION_BATTERY_CHANGEDアクションを追加 filter.addAction(Intent.ACTION_BATTERY_CHANGED); //ブロードキャストレシーバを登録する registerReceiver(mBroadcastReceiver, filter); }
バッテリーの情報をintentで受け取ります。
levelは充電の残量、scaleは充電の最大値です。
getIntentExtraの引数を変えることにより、バッテリーの温度や電圧を取得することもできます。
//ブロードキャストレシーバの実装 private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { int scale = 100; int level = 0; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals(Intent.ACTION_BATTERY_CHANGED)){ level = intent.getIntExtra("level", 0); scale = intent.getIntExtra("scale", 0); } int restBattery = (int)(level * 100 / scale); }
RemoteViewsにより、ウィジェットのview情報を取得できます。
今回は充電中とそうでないときでlayoutを変更しているため、remoteViewsに入る値について分岐があります。
ふきだしの画像はTextViewの背景として表示していますが、動的に変える方法が見つからなかったためです。
(標準のふきだしの色は黄色、充電中はオレンジにしています)
//表示する文字列とアイコンの変更 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); ComponentName componentName = new ComponentName(context, MainActivity.class); RemoteViews remoteViews; //画像と文言を指定する際に使う共通のキー String key = KEY_EMPTY; //充電中かどうかで表示するxmlとkeyが分岐 int status = intent.getIntExtra("status", 0); if(status == BatteryManager.BATTERY_STATUS_CHARGING){ remoteViews = new RemoteViews(context.getPackageName(), R.layout.main_charging); key = KEY_CHARGING; } else if(status == BatteryManager.BATTERY_STATUS_FULL){ remoteViews = new RemoteViews(context.getPackageName(), R.layout.main_normal); key = KEY_FULLCHARGE; } else{ remoteViews = new RemoteViews(context.getPackageName(), R.layout.main_normal); if(restBattery >= 91){ key = KEY_FULL; } else if(restBattery >= 51){ key = KEY_NORMAL; } else if(restBattery >= 25){ key = KEY_LOW; } else if(restBattery >= 0){ key = KEY_EMPTY; } }
上で充電の残量によって振り分けていたkeyは、表示する画像と台詞を指定するためのものです。
表示する画像と台詞の情報をそれぞれ予めHashMapに格納しておき、上記のkeyを用いて表示します。
//画像と文言をセット Random random = new Random(); //各範囲ごとに登録している文言の数が異なるため int randomKey = random.nextInt(msg.get(key).length); remoteViews.setTextViewText(R.id.baloon, msg.get(key)[randomKey]); remoteViews.setImageViewResource(R.id.img_galileo, image.get(key)); //クリックイベントが上書き消去されないように、updateAppWidgetの前に記述 Intent infoIntent = new Intent(context, Info.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, infoIntent, 0); remoteViews.setOnClickPendingIntent(R.id.img_galileo, pendingIntent); //表示の更新 appWidgetManager.updateAppWidget(componentName, remoteViews);
ソースのコメントでも触れていますが、デバッグ中、ガリレオ画像をタッチしても情報画面が開かなくなることがありました。
おそらく、バッテリー情報の変更に伴ってRemoteViews(ウィジェットの情報)を変更(=情報の上書き)するときに、タッチイベントがなくなってしまうためだろうと判断し、ウィジェットの表示を更新する際はクリックイベントも再度登録し直すことで改善されました。
また、Android実機を横回転させたときに縦のときとdipが異なることを知らず、終盤で慌てて表示の調整を行いました。横回転にすると、画面の縦幅が小さくなってしまう関係で、キャラクターとふきだしの大きさのバランスが悪くなったので、縦画面用のxmlと横画面用のxmlを分けて作りました。
バッテリー情報の取得処理に関する情報はネットにも本にも載っていて探しやすいため、骨格となる部分の処理の作成にはそれほど時間がかかりませんでした。
むしろ画像の表示といったデザイン部分に手間取ってしまいました。
また、「キャラクターにバッテリーを長持ちさせるコツを喋らせよう」という話になったはいいものの、意外と情報が少なくて苦労しました。充電を長持ちさせる方法は色々見かけるものの、バッテリーそのものの寿命を延ばす方法はかなり少なく驚きました。
アンドロイド携帯向けアプリの人気ランキングページです。ビジネスに、遊びに、とてもお役立ちのアンドロイドアプリが勢ぞろい。どのアプリも人気のある「10個」です。厳選されたラインナップ。もしかしたらあなたの携帯ライフを劇的に変えるアプリも現れるかもしれません!日々変わるこのアプリのランキング動向を、ぜひチェックしてください。
2024年シリーズ1 セレクション第2弾の評価ランキングを紹介します! 第・・・
プロスピA(プロ野球スピリッツA)の攻略情報をまとめたページです。 基本・・・
2024年シリーズ1 セレクション第1弾の評価ランキングを紹介します! 最・・・
2024年シリーズ1 TS第3弾の評価ランキングを紹介します! 前回はイチロ・・・
現役の選手・監督・コーチが全盛期の能力になって登場するTS(タイムスリッ・・・
2024年シリーズ1 エキサイティングプレイヤー第2弾の評価ランキングを紹介・・・
この記事では、エキサイティングプレイヤーに続くシリーズ1の目玉スカウト「プ・・・