2011年12月30日金曜日

物理キーのフック方法

物理キーのフックと言っても、もちろん自アプリが起動している時のみ制御可能。

以下のソースはバックキーを制御する場合のコード。
他にも検索キーやメニューキー、数字やアルファベットなどの物理キーボードもフック可能。
ただ、ホームキーだけは制御できない。
 
@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
    //やりたいことを書く
  }
  return false;
}

2011年12月26日月曜日

検索キー(長押し)でのアプリの起動

検索キー(長押し)でのアプリの起動方法。
ホームキーと同様に、AndroidManifestに<intent-filter>タグを追加するだけで実装できる。
<activity
  android:label="@string/activity_name"
  android:name=".SearchKeyActivity">
  <intent-filter>
    <action android:name="android.intent.action.SEARCH_LONG_PRESS" />
    <category android:name="android.intent.category.DEFAULT" />
</activity>
余談だけど、自分は初代XperiaとGalaxy Nexusしか使った事がないので検索キーの使い勝手が分からない。
だけど、あったら便利な気がいてる。
GNでは履歴キーなんかではなくて、検索キーが欲しかったなぁ。

スワイプポイントの不具合が直ったっ!

長かった…。
なんとかスワイプポイントの不具合が修正できました。

■v0.7.6
□スワイプポインタの不具合の修正
・上述の通り。

結局詳細な原因は分からないままなのだけど、WindowManager.LayoutParamsを作成する際に付与していたFLAG_FULLSCREENを外す事で正常に動作するようになった。

2011年12月25日日曜日

ホームアプリの作り方

ホームアプリの作り方と言っているが、ADWなどの本格的なホームアプリではなく、「ホームキーから起動できるアプリ」のこと。


ホームキーからアプリを呼出せるようにするのはそんなに難しい話ではなくて、AndroidManifestの<activity>タグに<intent-filter>タグを追加するだけ。
これを書くだけでどんなアプリでもホームキーから呼出せるようになり、ホームキーのデフォルトアプリに設定する事ができる。
<activity
  android:name=".HomeKeyActivity"
  android:label="@string/act_name_home_key_activity" >
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.HOME" />
  </intent-filter>
</activity>
が、これだけだと非常に危険。
最低限、このアプリからAndroidの設定アプリは起動できるようにしておかないといけない。
ホームキーから起動できるという事は端末起動時にこのアプリが起動するということ。
このアプリから他のアプリが起動できないと、このアプリ以外は何も操作できなくなってしまう。
なので、ホームキーに設定できるアプリはランチャー機能が必要なのだけど、それ以上に必要なのはAndroidの設定アプリを起動できるということ。ランチャー機能を入れていても、このアプリにバグがあって何もできなくなってしまったらどうしようもないしね。設定アプリさえ起動できればこのアプリをアンインストールしたり、デフォルトホームの設定を解除することができる。
Androidの設定アプリは以下のように起動することができる。
これをメニューか何かに入れておけばOK。
public void launchAndroidSettings() {
  Intent intent =  new Intent()
    .setAction(android.provider.Settings.ACTION_SETTINGS)
    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
  startActivity(intent);
}
※「最低限」と書いているけれど、Android4.0ではステータスバーから設定アプリを起動する事ができるので、絶対に必要という訳ではない。(3.0でもおそらく大丈夫)

Android開発について書いてみようと思う

Androidアプリの開発を初めて早くも1年が過ぎた。
プログラミングの知識がほぼゼロの状態から何とかマーケットに2個のアプリを公開し、それなりの評価も貰えるところまで成長できた。
そろそろ、開発を始めた当初の目標の1つである、プログラミングについてのブログを書きたいと思う。

以下、本ブログでAndroidプログラミングを書く(読む)上での前提。

・自身、Android開発を始めるまでプログラミング経験はほぼゼロ(15年ほど前に大学の授業でBASICを1年やっただけ)。Javaもやったことが無いので他言語との違いは分からない。
Android自体もあまり分かっていない(publicとかstaticとか未だに理解していない)
・あまりちゃんとソースを読んだりリファレンスを読んだりはしていないので、正確な理解はできていない。どちらかと言えばやってみたら動いた結果程度。
・ネタとしては主にssFlickerを使おうと思う。
・連載は不定期(要は気分次第)。

2011年12月24日土曜日

ssFlickerのマルチディスプレイ対応

Galaxy Nexusを購入してからssFlickerのマルチディスプレイ対応をしたんだけど、かなり大変だった…。
色々やって結局ほとんどは元に戻してしまったんだけど。情けない。

Androidにはサイズの指定方法がいくつかある。
元々ssFlickerではpx単位での指定をしていた。pxとはよく聞くピクセルのこと。
で、他にdip単位での指定ってのがある。
開発者としてあるまじき事に、私はdip単位が何なのかはなんとなくとしか理解していないのだけど、平たく言ってしまえば解像度による差をある程度吸収してくれる。
マルチディスプレイ対応としてpx指定をdip指定に変更したのだけど、結局これは全て戻してしまった。
ただ、これまでの選択肢だと大に設定しても小さい、小に設定しても大きいということがあったので、一部選択肢を増やす事で対応した。

もう1つがウィジェットの表示スペース。
もともとウィジェットの表示箇所は画面左上を起点としていたため、初代Xperiaではきっかり表示されていたんだけどGNでは左上に寄って表示されていた。
なので、上下左右でセンタリングするようにしたものの、今度は上下左右の空きが大きくなってしまった。
最終的には左右でセンタリングし、上下は上詰めにすることで対応。

Galaxy NexusがWi-Fiに繋がらない

家ではインターネット環境をWi-Fiにしているんだけど、以前からたまにWi-Fiの調子が悪かった。
Wi-FiルータをOFF/ONすれば復旧するのでそれほど気にしていなかったんだけど。
それでもGNだけがどうしても繋がらない事があった。
昨日、いい加減イライラしてきたので調べてみた。

ちゃんと理解はできていないのだけど、結論から言ってしまえば「GNで2.4GHz帯を使う場合はWi-Fiルータのチャンネルを1〜11に指定しなきゃダメ」ってこと。

我が家のWi-FiルータはAir Mac Expressを利用している。
802.11b/g互換に設定していて、チャンネルは1〜13の固定か自動かで設定できる。
ウチは自動で設定されていたため、ルータ起動時に1〜13の中からランダムで設定されていた。
一方、GNで使えるチャンネルは1〜11。(これは仕様を調べた訳ではなくて、試した結果論。12と13では繋がらなかった)
なので、ルータ起動時にたまたま12か13が設定されてしまった場合はGNがWi-Fiに繋がらなくなっていた。

で、疑問に思う点がGNとルータの仕様差異。なんでGNは11までしか使えないの?というところ。
日本では、802.11bでは14チャンネルまで、11gでは13チャンネルまで使えるらしい。
が、この内、14チャンネルは日本独自のもので、さらに12、13チャンネルはヨーロッパでは使えるもののアメリカでは使えないらしい。
GNはここがアメリカ仕様になっているみたい。
(地域によって使えるチャンネルの情報ソースは見つからなかったし、若干不正確かも知れない)

せめて13までは使えるようにしとけよ、という気もするけど、ここはいずれ直る事を期待しよう。
周波数帯の使い方って国によって違うので、この辺を統一するのはなかなか難しいんだろうなぁ。

2011年12月6日火曜日

ssFlickerとIceCreamSandwitch

12/2にGalaxy Nexusが発売、発売日に購入。
早速Android4.0でssFlickerを試してみた。
これまで初代XPERIA(2.1)でしか使っていなかったので、「4.0だから」だけではなく「機種が変わったから」発生した不具合を複数見つけてしまった…。
ss天気予報も不具合を見つけたんだけど、一旦保留。ゴメンなさい。