Android LiveView MN800 プラグインの作り方

プラグインを作ってみました。

liveview_watch2.jpg

3地域同時表示の手抜き世界時計です。

世界時計 watch2.apk

前回 書いたように LiveView MN800 のアプリケーションは親機の Android で
動いています。画面出力とボタン入力は Bluetooth を介して行われます。

プラグインは大きく分けて 2種類あります。

 (1) 通知 プラグイン
 (2) Sandbox プラグイン

(1) メールのように着信をテキストで通知する場合は指定の API でテキストを
送るだけです。標準的なユーザーインターフェースが予め用意されています。

(2) Sandbox プラグインは描画やボタン操作を全て自前で処理します。
使える描画手段は bitmap の転送だけです。
イメージデータを用意すれば、API を呼ぶだけで Bluetooth 経由で LiveView の
画面に送られます。

● Android SDK

Plug-in は Android アプリそのままなので、Android の開発環境が必要です。

SDK install 手順

LiveView Plug-in の場合、上記手順のうち Cygwin と NDK は不要となります。

● LiveView SDK

Create Android plug-ins for LiveView micro display

上記の場所から LiveView の SDK とドキュメントをダウンロードすることが
できます。

● LiveView SDK のサンプルを動かす

ダウンロードした LiveView_SDK_v1.01.zip を適当なフォルダに展開しておきます。

1. Eclipse を起動し File → Import
2. General を開いて「Existing Projects into Workspace」を選択 → Next
3. Select root directory の右の [Browse…] をクリック
4. 展開しておいた LiveView_SDK 内の sandboxPlugin を選択して OK
5. sandboxPlugin にチェックが自動で入るので Finish

Package Explorer で sandboxPlugin を選択してメニューの Run → Run 。
実機 (親機) が adb 接続してあるならこれで sandboxPlugin がインストール
されます。

「LiveView アプリケーション」を起動し タイルをカスタマイズ→プラグインの管理
を開き、プラグインが読み込まれていることを確認します。
設定で Enabled にチェックを入れたら LiveView 本体側で確認します。

● LiveView の API

SDK 付属のサンプルやテンプレートにはソースコードも多数含まれています。
一見難しそうに見えますが、プラグインのプログラムは
SandboxPluginService.java だけです。

API そのものは下記のファイルで定義されています。

IPluginServiceV1.aidl
IPluginServiceCallbackV1.aidl

中を見ると API 自体は非常にシンプルで数も少ないことがわかります。

その他の java コードはプラグインの雛形として使えるライブラリです。
必ずしも必要ではありませんがよく使う使われる処理がまとまっています。

基本的にはサンプルか Template をコピーし、必要な部分を置き換えていく
形になるかと思います。

●世界時計を作ってみた

サンプルの sandboxPlugin 自体にすでに簡単な時計機能が含まれています。
これを参考にして作ってみました。
ただし出来る限り機能を単純化(手抜き化)します。

(A) 表示は分単位にします
 sandboxPlugin は 1秒単位で画像を更新していますが、遅くなるし
 バッテリーを消耗しそうなのでやめておきます。

(B) 自動更新しません
 LiveView は操作しなければ 20秒くらいですぐ画面が消えます。
 1分未満ですぐ画面が消えるだろうとの予測の元、リアルタイムに表示を
 更新しないことにします。

時計として使う場合どうせボタンを押さなければ画面が表示されないので、
割りきってしまうことで画面の送信タイミングが下の 2つだけになります。

  ・プラグイン起動時
  ・画面が ON になった瞬間

自動更新しないので Timer 処理も不要となり、終了手順は何もしなくて
よくなりました。

もちろん表示時刻は厳密には正確ではありません。
1分程度の誤差が出るため、表示時刻の方を 30秒進めておきます。

世界時計 (watch2) ソースコード LiveView_watch2_v100.zip

セレクトボタンを押した場合も表示を更新するようになっています。
押すたびに下部の 3連アナログがランダムなサイコロに切り替わります。

●プログラムの説明

プラグインは WatchService.java です。

画面を更新したいタイミングで upgradeTime() を呼びだしています。
Handler に渡していますが、描画する内容自体は sendImage() で作られます。

128×128 dot の画像を生成し、その中に表示すべき情報を構築しています。
最後の mLiveViewAdapter.sendImageAsBitmap() でデータの送出です。

画面の更新速度は Bluetooth の通信状況に依存します。
プラグイン起動直後など、Bluetooth の通信が始まるまではしばらく待たされる
ことがあります。

watch2 の場合は特に画面 ON の通知が来てから表示の更新を行うので、
データが届くまでの間 LiveView の画面には古い時刻が表示され続けてしまいます。
時計としては致命的なので、画面 OFF のタイミングで「更新中」の文字を
転送しておきます。

 1. 表示が消える
 2. 画面 OFF のイベントが Plug-in に届く
 3. 「更新中」の文字を転送しておく (clearImage())
 4. 表示は消えているが LiveView の画面には「更新中」の文字がブレンドされる

 5. 電源ボタンを押すなどして画面が点灯する
 6. 4. の状態の画面が表示される。(つまり更新中マーク入り)
 7. 画面 ON のイベントが Plug-in に届く
 8. 現在時刻をもとに新しい画面を作って送信する
 9. LiveView の画面に最新の時刻が反映される

●startWork()/stopWork() とは何か

プラグインでは startWork()/stopWork() の定義が必須となっています。
これは AbstractPluginService から呼ばれるもので API には特にありません。

LiveView Plug-in の設定画面によく出てくる “Enabled” を実現するための
代物のようです。プリファレンスで Enabled のチェックを切り替える度に
この startWork()/stopWork() が呼ばれています。

●LiveView plug-in

プラグインの構造自体は画像を作って送信するだけなので、非常にわかりやすい
ものでした。Android のアプリそのままなので、いろいろ応用もできるし用途は
工夫次第だと思います。

ただやはりボタン反応は思うように動かないことがあり、操作性が悪く感じる
場合があります。一度動き出せばスムーズに反応するので、Bluetooth の
ネゴシエーションか省電力モードからの立ち上がりの遅延かもしれません。

関連エントリ

LiveView MN800 Android のマイクロディスプレイ