ステータスバー と タイトルバー の大きさ

ステータスバーとタイトルバーに大きさを表示する。
現行では、ステータスバーやタイトルバーの大きさを取得する簡便な方法がありません。

従来の方法

ネットでは、下記のように計算する方法が紹介されています。

Rect rect= new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight= rect.top;
int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight = contentViewTop - statusBarHeight;
if(titleBarHeight < 0){
  titleBarHeight = 0;
}

従来の方法の問題点

しかし、この方法では、正しく計算できない場合があります。

下記の4つのケースがあります。
(1) ステータスバーとタイトルバーが表示されている。
(2) ステータスバーだけが表示されている。
(3) タイトルバーだけが表示されている。
(4) ステータスバーとタイトルバーが両方とも非表示である。

下図に簡単に示します。

S: ステータスバー
T: タイトルバー
R: rect のビュー
C: ID_ANDROID_CONTENT のビュー
灰色: ステータスバーとタイトルバーを除いた領域

rect は 装飾物 (screen decorations) を除いた全面的な表示サイズ(the overall visible display size) のようです。
これは4つのケースにおいて、同じ値が取得されます。

ID_ANDROID_CONTENT は、ステータスバーとタイトルバーを除いた画面 (図の灰色) のはずです。
しかし、2のケースでは、そうなりません。

また、2と4のケースでは、rect と ID_ANDROID_CONTENT は同じ値です。
この2つの値からだけでは、2と4のケースが区別できません。

今回の方法

そこで、さらに2つの値を取得することにします。
1) 灰色の領域を、最上位の LinearLayout から取得します。

2) タイトルバーの有無を R.id.title から取得します。
R.id.title はタイトルバーのテキスト領域です。
タイトルバーの高さは 38px ですが、35px と少し小さい値が取得されます。

これらを組みわせると、4つのケースにおいて、
ステータスバーとタイトルバーの大きさが計算できます。

ソースは code.google に置いています。

ステータスバー と タイトルバー を非表示にする

ステータスバーとタイトルバーを非表示にするのは、Java でも、AndroidManifest でも設定できます。

Java では。
タイトルバーを非表示にする

requestWindowFeature(Window.FEATURE_NO_TITLE);

ステータスバーを非表示にする

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

AndroidManifest では。
タイトルバーを非表示にする

android:theme="@android:style/Theme.NoTitleBar"

ステータスバーとタイトルバーを非表示にする

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

ステータスバーを非表示にするのは、下記かと思ったが、これはエラーになります。

android:theme="@android:style/Theme.Fullscreen"

参考
Getting Height of Status and Title Bar
ステータスバーの高さを取得する方法
Activityのビュー階層とコンテンツルート(View)を取得する
reference: getWindowVisibleDisplayFrame
reference: ID_ANDROID_CONTENT
reference: R.id.title
reference: Theme_NoTitleBar_Fullscreen
reference: FEATURE_NO_TITLE
reference: FLAG_FULLSCREEN

SVN に res ディレクトリが登録できない

現象
Android のプロジェクトを SVN に登録したところ、
res ディレクトリが登録できなかった。

調査
ネットで調べてみたら、
.svn の log うんぬん という記事が見つかった。
res ディレクトリを見てみたら、
.svn はなくて、.DS_Store という隠しファイルがあった。
.DS_Store はファイル情報のキャッシュみたいだが、
何やら悪さをするという記事が見つかった。

原因
.DS_Store でした。
今回の res ディレクトリは新規作成ではなく、
他のプロジェクトからコピーしたもの。
そのさい、.DS_Store もついてきた模様。

対策
.DS_Store を削除してから、
eclips にて チーム -> クリーンアップ を実行して、
コミットしたら、無事に SVN に登録できた。

参考
svn: Working copy locked; try performing ‘cleanup’ クリーンアップができない
Macでアイコンやフォルダのトラブルを「.DS_Store」ファイルを削除して対処する方法

TextView に枠線を表示する

やり方は2つあります。

1. drawable ディレトリに xml ファイルを置き shape を設定する
この方法は、ボタンのカスタマイズとして、 Andoird Layout Cookbook に載っています。

2. LinearLayout に background を設定する

ソースコードは Google code に置いています。

参考
XMLで枠線を描画する
Androidで罫線描画

m3pi を注文した

m3pi は ARM の展示会でたびたび見かけるロボットです。
調べてみると、個人でも購入できるようです。
mbed はすでに持っているので、Robot のパーツを注文しました。
ついでに、拡張基板と、AVRライターも。
発送方法は、かんぱぱさんに倣って Fedex にしました。

Pololu m3pi Robot with mbed Socket : $149.95
3pi Expansion Kit with Cutouts : $11.95
Pololu USB AVR Programmer : $19.95
FedEx International Economy : $36.95
計 $218.80

関連
m3pi が届いた

参考
Pololu 3pi robotをオーダーしました
m3piを作ってみよう

誕生日 on Facebook

今日1月25日は私の誕生日です。

例年なら「誕生日おめでとう」のメールを数件貰うぐらいなのですが。
今年は Facebook 上で36人の方から「誕生日おめでとう」を頂きました。
Facebook 上の友人はそれほど多いわけではなく180名くらいです。
割合にすると、20%くらいです。

ちなみに、Twitter 上で私をフォローしている人は1560名いますが、「誕生日おめでとう」を頂いたのは一人だけです。
割合にすると 0.06% ですね。

やっぱり、Facebook はリアルな繋がりには強いようです。

しかし、Facebook 最強という話をするのは、少し早いです。
リアルを基盤としたネット上の繋がりは、20年前の パソコン通信 の時代にもありました。
当時は毎月のようにお誕生日会オフをやってました。
地方に住んでいてネット上でしか知らない人とリアルの会う機会があると、迎撃オフと称して歓迎会もやってました。
そんなに盛んだったパソコン通信も、インタネットの波に乗れず、2006年には終了しまた。

Facebook も今は勢いがありますが、何年かすると利用者に飽きられて、新しいサービスに移行しているかもしれません。

Facebook の盛衰はさておき、インタネットは便利ですね。
1月25日生まれの有名人も簡単に調べられます。
松本零士さん、楠みちはるさん、櫻井翔さんなどです。

参考
さよならパソコン通信!――NIFTY SERVE終了に伴い、パソコン通信全盛期を知る人々が東京に集結
wikipedia:1月25日

Android の時刻合わせ


写真は 2009年にうるう秒が挿入されたときの NICT 情報通信研究機構 の時計

インターネットやUNIXシステムでは NTP Network Time Protocol による時刻合わせが一般的です。
Android では、NTP は使わずに、3G回線による時刻合わせが行われているようです。
世界的には NITZ Network Identity and Time Zone という方法が採用されています。
日本の通信キャリアや機器メーカーは対応は不明です。
ネットの情報を総合すると、ドコモは対応、ソフトバンクは非対応のようです。

3G回線を使わず、WiFiのみを使う環境では、NTP を使うことになります。
例えば、Clock Sync のようなアプリがあります。
しかし、Android では、アプリによる時刻合わせは許可していないので、root化する必要があります。
アプリによる時刻合わせを許可して欲しい という要望も出ていますが、採用の兆しはないようです。

参考
wikipedia: NTP Network Time Protocol
wikipedia: NITZ Network Identity and Time Zone
Nexus One(Android携帯)の時刻同期のしくみ
Android時刻を原子時計並に正確に設定する Clock Sync
Allow user apps to set the system time

ワードプレス カフェ 第1回目

2012年1月18日 ワードプレス カフェ 第1回目を開催しました。
私は主催者側としてお手伝いしています。

昨年行っていたワードプレスの初級講座と中級講座を、参加者同士の交流を主眼
に、リニューアルしたものです。
場所は横浜・関内の さくらWORKS です。
参加者は12名、私を含めたスタッフが4名でした。
過去に講座に参加した人を想定していたのですが、半数が初めて参加する人で、ちょっと嬉しい誤算でした。

前半は簡単な講義。
今回は 今井良さん @ryo_apejp による発表
Facebook(フェイスブック)とWordPressの連携の仕組みとは?
コードの脆弱性の恐怖と対応

後半はフリートーク。
最初は、参加者同士で顔見知りの人と、初参加の人がいたこともあり、話が弾みませんで
したが。
徐々に慣れてきて、最後の方では活発なトークが展開されました。
当日出た質問は 掲示板 に掲載しています。

次回は、2月15日の予定です。

目覚まし時計 Alarm Clock

Android の標準アプリに目覚まし時計 AlarmClock がある。

donut(v1.6) の com.android.AlarmClock を移植した。
そのままコピーして、ユーザアプリとして、コンパイルを通るようにしたもの。

ソースコードは Google code に置いています。

AlarmClock の中には、アナログ時計のウィジェットも含まれています。

参考
Android Developers: AlarmClock
GingerBread から provider に移ったようです。