ラベル 設定 の投稿を表示しています。 すべての投稿を表示
ラベル 設定 の投稿を表示しています。 すべての投稿を表示

2013年8月19日月曜日

Sublime Text2使ってみた -前篇-

さすがにメモ帳レベルのテキストエディタでHTMLを書くのは限界なので…('A`)

Sublime Text2使ってみた

1. インストール

まずはここからバージョン, bitに合わせてダウンロードからインストール. 特にインストール項目を設定することもないかも.
Sublime Text2は, 初期状態のままではほぼ空っぽな状態. なので自分でカスタムしてやる必要がある.
ちなみに 3もベータ版だけど出ている模様.

2. 準備

A. Packageのインストール準備
様々カスタムしていく準備を行う. Packageとは要するにプラグイン. 
まずは View→Show Console でコンソールを開く. 出てきたウィンドウのうち, 上が表示エリア, 下が入力エリア. 間違って表示エリアに入力しようとして, 「入力できない(・д・`)」とかググらないように. 自分だけか…('A`)

コンソールには以下をコピペ.
import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
実行すると Packageをインストールするためのプラグイン「Package Control」をインポートする. 終わったら再起動. たまにこいつが突然消えることがある. よくわからないヽ('A`)ノ

B. 日本語化
有志の方が用意してくれたファイルを使って, 一部ではあるが日本語化ができる.
詳しくはこちら

C. ユーザ設定
Preference → Setting - Userを選択し, 出てくる設定ファイルにJSON形式で入力していく. フォントサイズや行間距離, 空白の表示方法等色々設定できる.
設定内容は以下のようなものが…
キー値バリュータイプデフォルト値内容
font_sizenumber11そのままの通り, 表示するフォントサイズの意. デフォルトは(おそらく)11
line_numbersbooleantrue左側の行番号の表示/非表示の切り替え.
gutterbooleantrue左側の行番号を表示している部分(ガーターと呼ぶらしい)自体の表示/非表示. ↑をfalseにするならこっちごとfalseにしてしまった方がいいかも?
marginnumber?ガーターとテキスト部の間の距離の指定. 負の値も設定可能.
fold_buttonsbooleantrue関数などの塊を"折りたたむ"機能のON/OFF. OFFにするとその分ガーターも狭まる.
fade_fold_buttonsbooleantrue↑の折りたたみ機能を 常時表示/カーソルを当てたときに表示 を切り替える. わかりにくい!って人はfalseにすると常に出ている.
rulersnumber[]縦にガーターの横に出ているようなラインを引く機能. 20と設定すれば, 半角で20文字入力した位置に, 縦にラインが引かれる. インデント揃える時などに? ","区切りで複数指定することも可能.
tab_sizenumber4Tabキーを1回押したときに表示されるスペースの量の設定. 10に設定すれば, Tabキー1回で半角スペース10個分進む. インデント幅にも影響する.
translate_tabs_to_spacesbooleanfalseTabキーを押した際に, Tab文字ではなくスペースを入力する. 削除しようとするとなぜか出力した分全てが削除される.
use_tab_stopsbooleantrue↑の"なぜか"の答え. こちらもfalseにしてやると, 削除する際スペース1個ずつ削除するようになる.
auto_match_enabledbooleantruetrueにしておくと, "("などを入力したとき, 自動で閉じる方も入力してくれる. 逆にこれが鬱陶しいなら falseで.
match_bracketsbooleantruetrueにしておくと, "("や")"にカーソルを合わせると, 対応するものに下線を引いてくれる.
…多いってばよorz
ちらっと上げようとしたのにキリが無いのでこのへんで.


ちょっと長くなってきたので続きは次で

2013年4月8日月曜日

Unityゲームを終了する

UnityでAndroidにビルドしていると思うこと
「ホームボタンでしか戻れないうえにバックグラウンドで生きてんの…?」

当然バッテリーはマッハなため非常によろしくない. が, デフォルトではそんな処理はしてくれない.
なのでスクリプトでつける必要があったのでメモメモφ(・ω・ )


Unityゲームを終了する


1. メソッド

Application.Quit();
これだけ.
このメソッドを呼ぶことでアプリケーションは閉じてくれる.

2. 実際に使ってみる

空の GameObjectを作り, GameManagerとでもしておく. 
void Update(){
    if (Application.platform == RuntimePlatform.Android && Input.GetKey(KeyCode.Escape)){
        Application.Quit();
    }
}
こんな内容のスクリプトを作り, GameManagerに持たせてやると, ゲーム中「戻る」キーを押すことでゲームが終了できる.
プラットフォームが Androidであることを確認してるけど, 「戻る」キーとか iPhoneには無いよなぁ….
毎フレーム呼び出すのが気持ち悪いなら何かしらボタンを作って, そこから反応してやると誤爆も少なくなっていいかも.

3(おまけ). ダイアログっぽい何か作ってみた

いいと思ったのでやってみようとした. ただ…ダイアログってどう作るんだ…?3Dには強いが2Dにはいまいち余計な手間がかかってしまうイメージ.

   3-1. 構想

      ヨクワカラナイのでとりあえず構想.
      ダイアログを開くボタンを押す → ダイアログからYesを選ぶ → ゲームが終わる!
      こうしたいなー(・з・)的な簡単な構想. 
      何やらいろいろやり方はアルっぽいけどよくわかんない('A`)
      AssetStoreにありそうだなー…
      ダイアログっぽいものを書く OnGUIを持ったスクリプトを動的に追加することで「ダイアログを開」き, このスクリプトを削除して「ダイアログを閉じ」たい. 
   

   3-2. ダイアログを開くボタン

      とりあえずボタン. これはシンプル.
using UnityEngine;
using System.Collections;

public class ButtonTest : MonoBehaviour {

 public bool isOpened = false;
 
 void OnGUI(){
  float sw = Screen.width;
  float sh = Screen.height;
  
  if (GUI.Button(new Rect(0,0,sw * 3/12,sh/12), "menu") && !isOpened) {
   Debug.Log("push!");
   isOpened = true;
  }
  
 }
}
sw, shはそれぞれ現在のスクリーンの幅/高さを取得. 割合でボタンの座標を決定してやると端末変わった時とかに順応しやすいかと.

ボタンを表示させているのが 7行目, GUI.Button(). なお GUIクラスは OnGUI()メソッド以外から呼ぼうとすると怒られる…(・ω・`)
このメソッドはボタンを作りつつ, 押されたときに trueを返すできる子. 一粒で二度おいしい.
最初の引数で表示位置を, 次の引数でボタンに表示するラベルを宣言. なお Rectについてはこんなのもございます(宣伝)

isOpenedはなんてことはない bool. これで制限をかけて, ボタン連打でダイアログ地獄, なんてのを避ける(予定).
これを空の GameObjectでも作って載せてやり, 実行するとボタンが左上に出るはず.

こんな感じ. なおこの状態で押しても, isOpenedをなんとかする方法がないので, ログは一個しか出てこないハズ.


      3-3. 「ダイアログ」を用意する

ここが一番困った. AndroidのDialogクラスみたいなのは見当たらないし, 仕方ないので別のクラスを自作し, そこでOnGUI()でもしてそれっぽく見せてみる.
using UnityEngine;
using System.Collections;

public class TestDialog : MonoBehaviour {
 
 public ButtonTest test;
 
 void Start(){
  test = this.gameObject.GetComponent<buttontest>() as ButtonTest;
 }
 
 void OnGUI () {
  float sw = Screen.width;
  float sh = Screen.height;
  GUI.Box(new Rect(sw / 3, sh / 3, sw / 3, sh / 3),"TestDialog");
  
  if (GUI.Button(new Rect(sw * 2 / 5, sh * 2/ 5, sw / 5, sh / 10), "yes")) {
                        Debug.Log("quite");
                        test.isOpened = false;
                        Destroy (this);
                        Application.Quit();
  }
  if (GUI.Button(new Rect(sw * 2 / 5, sh * 11 / 20, sw / 5, sh / 10), "no")){
                        Debug.Log("cancel");                        
                        test.isOpened = false;
                        Destroy (this);
  }
 }
}
こんなクラス. このスクリプトを 3-2. で作ったスクリプトを載せた空のオブジェクトに動的にくっつけることで表示させよう, という魂胆. menuボタンのイベントで動的にくっつければ, あたかもボタンでダイアログを開いたように見えるという寸法.

Start()はとりあえず 3-2のスクリプトの取得. isOpenedを書き換えて, 「開きっぱなしの状態」をキャンセルする.
15行目, GUI.Boxで, ただの四角い領域を描画. ついでに"TestDialog"とタイトルっぽく入れてみる.
中にはボタン2つ. yesと noボタン. この yesボタンの if()の中で Application.Quit()でも呼んでやれば目的は達成できるはず. でも実機じゃないと確認できない(・ω・`)
そしてDestroy(this)で このスクリプト を破棄することで, ダイアログ(?)を破棄する. アプリ終了する前に Destroy()しておくべきなのだろうか…

後は3-2の方, ボタンのイベントの中を
if (GUI.Button(new Rect(0,0,sw * 3/12,sh/12), "menu") && !isOpened) {
   Debug.Log("push!");
   this.gameObject.AddComponent<TestDialog>();
   isOpened = true;
  }
と, AddComponent()してやることで, ここで作ったスクリプトを動的に足す.
これで, menuボタンを押すと,
みょん. それっぽいものが出てきてくれました.
Inspectorの方を確認して, 動的にスクリプトが追加されているのも確認しておくといいかも.
ちなみに3-2の方, ボタンの if()文を,
if (!isOpened && GUI.Button(new Rect(0,0,sw * 3/12,sh/12), "menu")) {
   Debug.Log("push!");
   this.gameObject.AddComponent<TestDialog>();
   isOpened = true;
  }
としてみると, ダイアログっぽいものを開く際変化する isOpenedのほうの条件に引っかかるのか, そのあとの条件となっている menuボタン描画メソッドが呼ばれなくなり,

menuボタンが消える. これはこれで使いようがありそうだったのでメモメモφ(・ω・ ).





おまけのが充実してる気がするけど仕様です. ( ´∀`)ノシ キニシナイ

2012年11月1日木曜日

androidのアプリケーション名の落とし穴

「アプリケーション名がStrings.xmlのapp_nameで出てこない」
こんなことを言われたのが先日.

「そんなんManifestの<application>にandroid:labelタグで設定されてるやん」
とか調子こいていたのもつかの間


「app_nameが出てこない…( ゚д゚ )」



ということで今回のお題

ランチャーに表示するアプリケーション名の設定場所


結論から言うと原因はManifestの<intent-filter>
ただしこいつは悪さをしていたわけではなく, むしろ一生懸命仕事をした結果が原因らしい.

通常アプリを開いて最初に開きたいActivityには, Manifestにて

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>

    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>


と宣言するはず.
すると, この<intent-filter>, こいつがランチャーに表示する名前を探し出す.
問題はこの時, <application>へ探しに行ってくれれば良いのに,

まず自分
  ↓
無ければ自分を含むActivity

の順に探そうとする.
結果, 名前を指定してやらなかったことが災いして, Activityにつけた名前を
「これがアプリケーション名だ!+(゚∀゚ 0)*」
とうれしそうに表示するわけですよ.
それじゃない…それじゃないんだ…!

なので

<intent-filter
    android:label="@string/app_name">
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

といった形で, <intent-filter>のlabelで教えてやると, 望んだとおりのお仕事をしてくれます.





ちなみに  自分を含むActivity にすらlabelが無かった場合, 表示するのは
そのActivityのパッケージ名 + Activity名
…そりゃねぇよorz
<application>さん使ってやれよ…

11/19訂正: ちゃんと<application>から取ってきてくれるみたいですorz
もうやだこのIS03

2012年10月29日月曜日

Androidで設定を参照, 操作するあれこれ -画面の輝度編-

忙しかった…余計な仕事は背負い込むもんじゃないね('A`)


だいぶ間が開いてしまったけど
久々にAndroidさんに怒られたので書いてみる.


画面の輝度の操作


簡単に言ってしまえば「画面の明るさ変えるよ(゚∀゚)」ってだけなこと.
一昔前にこれ利用したライトアプリなんかあったとか無かったとか.

いつもどおりAndroidさんの設定に手を加えるべく.お邪魔するのは

import android.provider.Settings.System;

Androidの設定は基本ここにお願いなことはいい加減わかってきた.

1. 設定の変更


値が入っているのは

System.SCREEN_BRIGHTNESS

今回はここ.
ここの値をputしてやれば良いのだが値に注意.

まず値は
0 ~ 255
であり, また機種によっては
0 = ブラックアウト
と認識して何も見えなくなってしまうらしい点.
なので値は
1 ~ 255
にしておくといろいろ安心.

また0% ~ 100% で表記したいなら自分で計算してやるよろし.
というわけで


System.putInt(ContentResolver, System.SCREEN_BRIGHTNESS, "値");

当然値はint型でok.

2. 画面の明るさの変更


お前1. でやったじゃん と言う無かれ.
1. はあくまで 設定の変更 だけで, すぐにその設定が反映されるかといえば答えはNO.
なのですぐに反映してやりたいとき, また1. を利用する際, デモンストレーション的に明るさを変えたいときにはこちら.

ただしここで怒られた.
実は1. も2. もAsyncTask使ってUIスレッドの裏で処理をさせようとしたところ

おまUIスレッド以外からUIイジってんじゃねーよ ゴルァ!!щ(・Д・´#щ) =3

と怒られましてorz
1. はともかくこれからいじる2. に関してはUIスレッド上でやりましょう, ってお話.

ひとまずソース

LayoutParams layoutParams = getWindow().getAttributes();
layoutParams.screenBrightness = "値";
getWindow().setAttributes(layoutParams);

やってることは割りと単純.
1行目で現在の画面の情報を取得.
2行目でその情報のうち 画面の輝度 に好きな値を投入(ただしfloat型かつ0.0 ~ 1.0の間という統一感の無さ)
3行目で反映…のはずなんだけど…なぜか無くても変わる!不思議!

…なんでだろ(・ω・`)

まぁとりあえずそのActivityくらいしか明るさは保たないので一時的なしのぎにでも.
最初に述べたライトアプリなんかにはむしろ都合が良いとか何とか.



まただらだらと書いてしまった…('A`)



2012年10月15日月曜日

Androidで設定を参照, 操作するあれこれ -バッテリーwithService編-

以前のバッテリー情報取得のその後.
Activityの内部クラスにしとけばいいや, 参照しやすいし.
などと考えていたら

Serviceに乗せなさい



orz

通達が来ましたとさ.


Serviceを用いてBattery情報を得る

当初は
「ServiceからActivityを書き換えるってどうやるんだ…?Binder?ServiceConnection?Messengerを使えば値を渡せるのか!」
などと迷走を続けていたところ

sendBroadcastでえぇやん(意訳
でないと汎用性下がるし

と2度目のorz
ほぼ一日かけてたどり着いたMessengerは無に返り, 晴れてsendBroadcastによる実装が残りましたとさorz

という愚痴を書きたかっただけ.

1. Service側

まずはService側. いたって単純で, Intent.ACTION_BATTERY_CHANGEDを受け取ったらオリジナルのIntentに必要な情報を載せて発信するだけのもの.


public class BatteryService extends Service {


    public static final String ORIGN_ACTION = "orignbatteryaction";

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, final Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                // オリジナルのActionでintentを作成
                Intent sendIntent = new Intent(BatteryService.ORIGN_ACTION);
                // levelを載せる
                sendIntent.putExtra("level", level);
                sendBroadcast(sendIntent);
            }        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(mReceiver, filter);
    }

    @Override
    public void onStart(final Intent intent, final int startId) {
        super.onStart(intent, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
        Log.i("hogeBatteryService", "unregisterReceiver");
    }

    @Override
    public IBinder onBind(final Intent arg0) {
        return null;
    }
}

たまにはまるっと載せてみる.mReceiverの中, コメントにある通りACTIONの部分を自作してやるだけ. 名前はユニークになるように. 万一被ると大変なことになる…かも?('A`)
後はintentを送る際,

startActivity(sendIntent)

ではなく
sendBroadcast(sendIntent)

を用いれば, 行き先を指定しないIntentの出来上がり.

2. Activity側


こちらもほぼ同様.


public class ResidureBatteryCheckerActivity extends Activity {

    private static TextView textView;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_residure_battery_checker);
        textView = ((TextView) findViewById(R.id.hoge_battery_check));
    }

    @Override
    public void onResume() {
        super.onResume();
        // バッテリー情報更新のサービスを開始する
        Intent batteryIntent = new Intent(this, BatteryService.class);
        if (startService(batteryIntent) == null) {
            Log.e("hogeMakeFirstSetting", "cannot Start Service");
        } else {
            Log.i("hogeMakeFirstSetting", "Service is Start!");

            // ServiceからのBroadcastを受け取るReceiverを立てる
            IntentFilter filter = new IntentFilter();
            filter.addAction(BatteryService.ORIGN_ACTION);
            registerReceiver(orignReceiver, filter);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(orignReceiver);
        stopService(new Intent(this, BatteryService.class));
    }

    public static void changeText(final String message) {
        if (textView != null) {
            textView.setText(message);
        }
    }

    // オリジナルのIntentを受け取るReceiver
    private final BroadcastReceiver orignReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, final Intent intent) {
            if (intent.getAction().equals(BatteryService.ORIGN_ACTION)) {
                int level = intent.getIntExtra("level", 0);
                String message = "level is " + level;
                changeText(message);
            }
        }
    };
}

なんてことは無く, ただReceiverを立て, ただオリジナルIntentを拾い, 情報を取り出して好きに使うだけ.
なおReceiverはonDestroyなどできちんとunregisterReceiverしましょう. でないとちゃんと休ませろって警告が来ます. 主にLogに.Serviceはお好みで. ただ止める手段がないと走り続けてバッテリーがマッハ.ヽ(;´Д`)ノ








…Messengerを使ったものはこの倍はコードがあったわけで, 結果としては良かった…のかな.
Handlerとか良くわかんなかったしorz

2012年10月14日日曜日

Androidで設定を参照, 操作するあれこれ -Wi-fiの小ネタ編-

DeveloperのSettings.Systemのあたりを漁っていたら見つけたので


Wi-fiのスリープ設定

正直こんなことも無ければ知らなかったであろう機能.
簡単に言ってしまえば「本体がスリープしたときWi-fiもスリープする?」という設定ができる機能が本体の設定の中にあったわけで…


一生懸命画面のOffのIntentとってなんとかしようとか考えてたのは一体…orz


ちなみに設定までの行き方は
「Wi-fi設定」でメニューを開き「詳細設定」へ…

メニューて…('A`)

とまぁなかなかエキセントリック遠い所に設定があるのでボタン一発で書き換えてやろう, と考えた次第.


とりあえずコード.まずは設定の取得から.


android.provider.Settings.System.getInt(contentresolver,android.provider.Settings.System.WIFI_SLEEP_POLICY,-1);

長い…
画面の設定編でもやった通り,

import android.provider.Settings.System;
しておくと楽かと
parmissionも WRITE_SETTINGS だけでOK(なはず).
内容もいたって簡単.WIFI_SLEEP_POLICYの今の設定をintで返すだけ.
設定は3種類.


0 = WIFI_SLEEP_POLICY_DEFAULT : 画面のスリープと一緒にスリープする
2 = WIFI_SLEEP_POLICY_NEVER : スリープしない
1 = WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED : 電源につながっていればスリープしない

の3つ.

設定の書き換えも
android.provider.Settings.System.putInt(contentresolver,android.provider.Settings.System.WIFI_SLEEP_POLICY,values)

のvaluesに0から2の好きな値を入れてやればOK.
boolean型が返ってくるので, ifで囲って書き込み成功/失敗をとってやればより安全にできるかと.



…parmissionあってるかな…(・ω・`)

2012年10月10日水曜日

Androidで設定を参照, 操作するあれこれ -画面の設定編-

今回はいったいいつ使うのかわからないネタ


android端末の画面の設定を操作


うん…普通に設定開けば良いじゃんとか言わない.アーアー<'(;´Д`)>キコエナイー
見つけて使ってみたから書く…うん


0. 下準備

まず始めに準備するのが.ManifestのUse-Parmission.
ここに

android.permission.WRITE_SETTINGS

これを許可してやる.
許可しないと基本設定を書き込めません.
一部読むだけなら要らないのもあるけれど…

そして


import android.provider.Settings.System;

をimportしておくことをお勧めする.
でないとSystemと一口に言っても, System.out.printlnでおなじみのjava.langや, android.osなどにもSystemがある.
そのため, 以降別のSystemを眺めながら「そんなメソッド見つからない!」とかIDEさんに理不尽に怒られる可能性があります.('A`)コレハヒドイ

1. 画面の点灯時間の設定

いわゆるオートスリープまでの時間の設定.
まずは, 今の設定を呼び出すメソッド.

System.getInt(getContentResolver(),System.SCREEN_OFF_TIMEOUT)

これだけ.
もしくは,
System.getInt(getContentResolver(),System.SCREEN_OFF_TIMEOUT, -1)

これだけ.
最初の引数はContentRe
最後の引数の-1は今回は特に関係ないようです.getIntによくあるデフォルト値?
ちなみに-1は「消灯しない」の設定みたい
第一引数のContentResolverはともかく
第二引数のSystem.SCREEN_OFF_TIMEOUT, これでどの情報にアクセスするかを設定しているみたい.

これで現在の設定が取得可能. 取得はミリ秒単位.

取得したら今度は設定.


System.putInt(getContentResolver(), System.SCREEN_OFF_TIMEOUT, 設定したい時間(ミリ秒));

これだけ.
設定したい時間に好きな値を放り込めばOK.
本体の設定アプリにない値も設定できます.



だれか一年とか設定してみた人いないのかな|・ω・`)チラッ


2. 画面の回転の設定

Notification Barを引っ張れば良いとか言わない.
Widget出せば良いとか言わない.

System.getInt(getContentResolver(),System.ACCELEROMETER_ROTATION)

まずは設定の取得. 既視感?少し上を見れば解決するかと.
基本Settings.Systemはこのメソッドで何とかなりそう.
返ってくる値は0(ロック状態), 1(ロック解除状態)の2種類.
表示するなら一工夫必要.

そして設定.

System.putInt(getContentResolver(),System.ACCELEROMETER_ROTATION, 0 or 1);

大方の予想通りでございます. はい.
0 or 1 でロック or アンロック を指定できます.

非常にシンプルなのでボタン一個で設定できるのもうなずけます.

とりあえずはこのあたり.











コード少ないなぁ…(・ω・`)

2012年10月9日火曜日

Androidで設定を参照, 操作するあれこれ -バッテリー編-

久々のAndroidキター
ただいまjava!私は帰ってきた!+(・ω・0)*




まあメモるのは初めてなんですがね(;´Д`)


内容は

androidの設定を操作するアプリの作成

ということでそのパーツ毎にちらほらとメモしていく予定


まずはバッテリー編からφ(・ω・`)

android端末のバッテリー情報を取得


端末のバッテリー情報を取るならIntent.ACTION_BATTERY_CHANGEDのお世話になるのが楽.
…他にも方法あるのかな

このIntentは, システムが「バッテリーの残量や状態が変更された時」, その情報を載せてIntentを発行していてくれている(らしい)

なのでこれを受信する受信機を用意してやればいい, とのこと

そこで登場するのがBroadcastReceiverクラス
ブロードキャスト化されたIntentを拾えるこのクラスを継承して, BatteryReceiverなるクラスを作ります

1. Receiverの作成


public static final class BatteryReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(final Context context, final Intent intent) {
                        // actionの取得
   String action = intent.getAction();
                        // actionの確認. Intent.ACTION_BATTERY_CHANGED以外のintentは排除する
   if (!action.equals(Intent.ACTION_BATTERY_CHANGED)) {
    Log.d("BatteryReceiver ", "action is " + action);
    return;
   }

   // 状態, 「充電中」等の状態がintで取れる
   int status = intent.getIntExtra("status", 0);
   // 電池残量, デフォルトは0.
   int level = intent.getIntExtra("level", 0);

   Log.d("level", level + "%");
  }
 }

とりあえずシンプルにバッテリーの状態と残量(%)だけを取得するクラス.
このレシーバーを立てておく. 立て方は後々
Intent.ACTION_BATTERY_CHANGEDを受け取るとonReceiveが呼ばれて処理スタート.
まずはコメントにあるとおり, 余計なIntentはreturnで排除.
・・・余計なIntentって入ってくるのかな.
その後はもうお好きに.
Intentからお好みの情報を引き出して操作するだけ.
Intentに含まれる値に関しては参考を参照.

参考:http://www.adakoda.com/android/000140.html

また, このonReceiveはオーバーライドメソッドなので, ココ以外に値を持ち出すときは一工夫必要.
上記をまるっと内部クラスにしてやるのが一番扱いやすい・・・?

ほかにもServiceクラスに乗せるなどの使い方も.
ここで得られる値もWidget向きだったりするのでServiceで使うのもアリ・・・?

疑問系ばかりであるorz

2. Filterの登録


BatteryReceiver receiver = new BatteryReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(receiver, filter);

Receiverが出来たら, 今度はIntentFilterをかけてやる. こちらはActivityならonCreateやonResumeなどで宣言してやるといい.
1,2行目で作ったReceiverとIntentFilterをインスタンス化.
3行目の addAction メソッドで件の Intent.ACTION_BATTERY_CHANGED をfilterが受け取ることを宣言.
4行目でそのfilterとreceiverを関連付けて宣言は終了.
あとはこのメソッドを通るように起動させればReceiver起動.


IntentがくるたびにReceiverが動いてくれる.

3. Receiverの破棄

unregisterReceiver(receiver);
これだけ.
これをonDestoryなど, もう要らないと判断される時に呼べばいい.
ただonPauseがいいのかonDestoryがいいのかは微妙….
もっと他にいいとこあるかも…?

これで必要なパーツはそろい踏み.

Widgetなんかにしてバッテリー残量によってアクションが変わるアプリなんかが作りやすいかも.








…アプリ自体がバッテリー食うのは内緒( ´д)ヒソ(´д`)ヒソ(д` )

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...