2012年5月13日日曜日

116円ケチるために頑張ってAndroidアプリを開発した

前置き

自分はAndroidタブレットの ICONIA TAB A500 を使用するときはいつも横向きで使用する。

なのでたまーに↓のような縦向き固定のアプリに出くわすととても悲しい気持ちになる。

device-2012-05-13-212834

この問題を解消するアプリないかなーと探すものの、引っかかるのは画面の自動回転をON/OFFするアプリばかり。

そんななか唯一見つかったのが Orientation Control というアプリ。

しかし有料。

いや、116円くらい出せよ!という声が聞こえてきそうなのですが今月はすでに懐が心許ない状態。

あとは出来ればGoogle Checkoutに登録したくないというのも理由のひとつ。

(余談だけどGoogle CheckoutはAppleのiTunes カードみたいにクレカ不要で買えるようにして欲しい。

さらに言うとJCBやPayPalなどにも対応して欲しい。)

というわけで自作してみる。

とは言ったものの、コレにあまり時間をかけたくないので2日間かけて出来なかったら素直にGoogle Checkoutに登録して116円でアプリを購入する。

 

始めに

Orientation Control の説明文やアクセス許可を拝見。

説明文にはrootが不要、必要なアクセスは 端末のステータスと ID の読み取り・システムの全般設定の変更・起動時に自動的に開始 の3つ。

もしrootが必要だったりアクセス許可が多かったら諦めようと思っていたので安堵。

とりあえず超トリッキーなことをしているわけでは無く、普通にAndroidで出来ることをして画面の向きを固定指定しているみたいだ。

それにしても システムの全般設定の変更 と 起動時に自動的に開始 というのは兎も角、端末のステータスと ID の読み取りは何に使っているのだろうか?(未だにわからない...)

 

自動回転

システムの全般設定の変更 というわけで Settings.System | Android Developers をざっと眺めてみる。

目に付いたのは ACCELEROMETER_ROTATION と USER_ROTATION。

あれ?これでいけるんじゃ…。と思いパパッと実装して見るも轟沈。

ACCELEROMETER_ROTATION は予想通り自動回転の有効・無効を設定するものだったけど、USER_ROTATIONは設定した向きに固定するのではなく、自動回転が有効の場合、どの方向に回転出来るのか設定するものでした。

 

表示レイヤー

実はどう巡って 画面上にアプリの情報を常時表示する こちらのページに辿り着いたのか覚えていないけれど(恐らくWindowManagerとServiceらへんを調べていた)、このページの「Androidの画面(View)は複数のレイヤーで構成されており、これらのレイヤーは情報の重要度・優先度によって使い分けられています。」という一文を読んで閃きました。

通常アプリより上のレイヤーに横向き固定のViewを作ればいいんだと。

 

横向き固定のView

こういうのは例によってレイアウトを弄れば良いんでしょう?

というわけでWindowManagerにViewを追加するメソッド addView の第2引数に使われる WindowManager.LayoutParams クラスのドキュメント WindowManager.LayoutParams | Android Developers を読んでみる。

するとフィールドに screenOrientation というもっともらしいものを発見。

この screenOrientation のデフォルト値は SCREEN_ORIENTATION_UNSPECIFIED という特に向きについて指定しないもの。

これを SCREEN_ORIENTATION_LANDSCAPE にするば横向き固定になる。...はず。

 

実装

先ほどの表示レイヤーについて言及しているページに掲載されているソースコードを元にちゃちゃっと実装。

ついでに調べ物をしている最中に殺されにくいServiceの作り方 Service | Android Developers を見つけたので実装してみる。

.

.

.

 

そんなこんなでゴリゴリソースコード書いてちゃちゃっと完成

 

 device-2012-05-13-213433

操作方法は実にシンプルでわかりやすい。

というか寂しい…。

 

device-2012-05-13-213450

先ほどの縦向き固定のアプリもこの通り。

 

というわけでアプリを作ろうと思い立ってから4時間ほどで目標達成。

自分にしては珍しく(奇跡的と言っても過言ではない)目標時間内に終わらせることが出来た。

 

成果物

誰得な感じもするけれどアプリのapkとソース一式。

https://github.com/monkiti/LandscapeLock

https://bitbucket.org/monkiti/landscapelock

GitHubとBitbucketの両方にアップしてますけど当然内容は一緒です。

それにしても初めてまともに使った(Bitbucket自体はPrivateで沢山使っている。)ので色々と不安。

BitbucketとGitHubを同期させるのにえらい戸惑ったなぁ。

 

まとめ

たかが116円ケチっただけでAndroidの表示レイヤーと殺されにくいサービスの作り方を学べたのは大きかった。

とは言え、毎度毎度こう都合良くいく筈も無いので次からは素直にお金を払いましょう(と言いつつも今回のことに味を占めてまた自前で作りそうだけど...)。

 

今気付いたんだけど 対象の気になるアプリを購入する → 15分以内にアプリの動作などを調べ上げる → 購入をキャンセルして払い戻し → 調査結果を元に自前でアプリを作成 とすると(ry

1 件のコメント: