高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

Android SDK環境をLinux上に構築するという話

作りたいアプリでTesseract-OCRを使うことになりました。
このライブラリにはAndroidバイナリがないため、Androidで使うためには独自にビルドが必要ですが、ビルドはどうもLinuxでしかできない(Cygwinではできない)らしいので、Linuxに開発環境を構築しなければいけなくなりました。
Linuxが絡むと大体泥沼にはまるのがわたしの常なのでLinuxには触れたくなかったのですが・・・。他にないのでしかたがない。

で、とりあえずWindows 8のHyper-VにCent OSを入れてみました。なぜCent OSなのかというと、Hyper-V 統合サービス(Linux Integration )というHyper-V用のサービスがMicrosoftより提供されていて、これがCent OSに対応しているため。スナップショットをとっておけばまずくなったときに復元できるので、比較的気は楽です。

で、とりあえずTesseract-OCRのビルドに成功。いろいろ右往左往したのであんまり覚えてないところもありますが、ひとまず手順をメモします。

Cent OS環境の構築

とりあえず環境を構築しLinux統合サービスをインストールするまではレガシーなネットワークアダプタしか使えず再設定の手間が生じるため、そこまでは一切ネットワークに接続しないつもりで。

  1. ひとまず、Cent OSのISOイメージを入手します。minimal.isoで構わないと思います。
  2. 仮想マシンを作成します。Hyper-Vマネージャーを起動して、仮想マシンの新規作成を行います。
  3. セットアップするISOイメージにISOイメージを設定します。
  4. 仮想マシンを起動し、画面の指示の通りにインストール処理を進める(メッセージは英語のみですが、ちゃんと読んで理解できるレベルだったと思います)
  5. インストールできたら、こちらの記事を参考にLinux統合サービスをインストールします。NICは何も刺さっていない状態になっていると思うので、Linux統合サービスまでで構いません。

ここまで終わったらいったん仮想マシンをシャットダウンします。この辺でスナップショットを作っておくと良いでしょう。

無線LANを使っている場合

Hyper-Vを使うPCで無線LANを使っていた場合は、ネットワークアダプタを設定する前に内部向け仮想ネットワークアダプタを作っておく必要があります。

  1. 仮想スイッチマネージャを開き、「新しい仮想ネットワークスイッチ」として、「内部接続」のスイッチを作成する。このスイッチにはわかりやすい名前をつけておいてください(自分は「無線LAN用」とという名前をつけました)
  2. 「ネットワークと共有センター」を開き、アダプターの設定の変更から、さきほど作ったアダプタとWi-Fi接続をブリッジ接続します。

しばらくたってWi-Fi接続出来るようになったらOKです。

仮想マシンの最低限の設定を行う

仮想マシンをネットに繋げるようにして、Cent OS標準アプリインストールサービスyumを使えるようにします。

  1. 仮想マシンの電源を切った状態で、設定画面を開きます。
  2. ネットワークアダプタを設定します。有線LAN接続の場合はそれぞれに該当するアダプタ、無線LAN接続の場合は先に作成した無線LAN用のアダプタを指定します。
  3. 仮想マシンの電源を入れて、次の三つのファイルを編集します。この辺は環境によって値が大きく変わる部分ですので、各自検索の上使用されることをお勧めします。なお、DHCPサーバを使うと色々と面倒になりますので独自でIPアドレスを指定してしまうのがオススメです。
  4. 設定が終わったら一度仮想マシンごと再起動させて、次のアプリをインストール(なお、Cent OSにはSSHが最初からインストールされていますので、このあたりからはSSHクライアントを使って操作しても良いはずです。Poderosaなどだと文字の選択や複数コンソールの表示も出来るようになりますので便利です)
古いJDKが入っていた場合

OpenJDKなどの古いJDKバージョンが入っていた場合、JAVAがうまく認識されない場合があります。その場合は次のようにして対応します。

mv /usr/bin/java /usr/bin/java.old
ln -s /usr/java/default/bin/java /usr/bin/java

Android SDK/NDKのインストール

GoogleからLinux用のSDK/NDKバイナリを入手します。入手したものはConfigure Android SDK on CentOS 6 x86_64 - echocat - echocatなどを参考に展開・配置します。
GUIを使わないでセットアップする方法はAndroidの会のMLにありました。次のコマンドを利用します。

android update sdk -t platform -u
android update sdk -u

結構時間がかかるのでお茶でも飲んで待ちましょう。


とりあえずここまででAndroid SDKのビルド環境は完成しました。いろいろ迷走の上書いているのでどこか抜けているところはあるかもしれません。
とりあえず分からないところがあればTwitterなどで聞いていただければ答えられるかもしれません。


Tesseract-OCRの動作についてはとりあえずビルドはで来たもののうまく動作していない状態(エラーは出さないものの動作もしない状態)。まだうまく出来てないので、でき次第書こうかと思います。

Androidのコマンドとか権限とかの話

最近会社の業務効率化ツールなどを書いてることが多い。対象にはAndroidの自動処理も入っており、家ではそうそう関わらないフレームワーク周りの機能について調べることもしばしば。

ということで前振り長くなりました。Androidのコマンド周りとか権限の仕組みについて簡単に調べたのでメモ。

権限の仕組み

AndroidManifest.xmlのuses-permissionタグに宣言して使う権限ですが、この権限は基本的に以下の四種類のprotection-levelに分かれています。

normal バイブレーションの制御、ネットワーク状態の表示など、ユーザーデメリットとなる可能性の少ない権限。アプリケーションインストール時に表示はされるが「その他の権限」にまとめられており最初は隠れている
dangerous インターネット接続や電話の発信など、ユーザーにデメリットとなりうる権限。アプリケーションインストール時に使用する権限の一覧として表示される
signature キーボードの遠隔操作など一般開放されては脆弱性になりうる権限。APIを使用するアプリと現在フォアグラウンドなアプリが同一の署名(作者)である場合のみ使用可能(と思っていたのですが、一般的にはプリインアプリのみ使用可能という扱いだそうで。詳細はよく分かりません*1)。アプリケーションインストール時には表示されない
signatureOrSystem アプリケーションの(ユーザー確認を伴わない)インストールなどの強力な権限。プリインストール(/system/app配下にインストールされている)アプリと同一の署名(つまりgoogleかOHA標準アプリ、キャリアや端末ベンダーのみ)でしか使用できない。

au one Marketなど、キャリアのマーケットアプリでのみ「提供元不明のアプリ」にチェックをいれなくてもアプリケーションインストールが可能だったりするのは、アプリケーションのインストール(android.permission.INSTALL_PACKAGES)がsignatureOrSystemレベルの権限であるせい。

権限を行使できない権限を付与したアプリは使用できないわけではないが、もし権限の行使に失敗しても、権限記載などなかったかのように失敗するのでぱっと見わかりづらい*2ので、その辺は注意するしかない。
なお、権限はそれぞれAndroidManifest.xmlのpermissionタグで宣言する(権限の表示名もそこで決定する)。システム標準と思われるすべての権限は、システムコアのパッケージがpermission宣言している。

コマンドについて

以前にも触れたキーボードのボタン押下をエミュレートできる強力なコマンド、input。これは、一般のアプリケーションから呼び出しを行った場合、そのアプリケーションの権限の元で動くことになっているらしい。
そのため、他のアプリケーションがフォアグラウンド状態であるときにinputコマンドを入力しても、キーイベントなどを挿入するandroid,permission.INJECT_EVENTS権限がないと怒られてしまう*3
他に権限が影響する系統のコマンドは見つけられていないものの、基本的にはこのようになっている様子。inputコマンドを見つけたときは「こんなコマンド放置しておいて大丈夫なのか?」と思いましたがコレで解決です(ただし、adbからはコマンドが実行できるので、USBケーブルを繋いだ or rootかつワイヤレスadbが有効な状態で端末を放置しておくのはかなり危険であると)。


Androidもこうやって調べてみるとなかなか奥が深いフレームワークを積んでいるようです。仕事でやっているとはいえ、これはとても勉強になる。このへんの知識を趣味の開発に活かせられるのかなあ。

*1:コンソールエミュレータアプリなどからは一部これに該当すると思われる操作もできるため

*2:たとえばsignature権限のINJECT_EVENTSを他者のアプリがフォアグラウンドの時に行使しようとした場合、AndroidManifest.xmlに権限記載をしてもしなくても同一の例外が返る。権限指定のスペルミスと区別が付かなくて困りました…

*3:ただ、signature権限であるため、コマンド実行を指示したアプリケーションとそのときにフォアグラウンドなアプリケーションが同一である場合はコマンドの実行が行える(例. 端末エミュレータからinputコマンドを実行した場合は、成功する

Streak買ってました

そういえば、Streak買ってました。最近話題になっているWILLCOMWX130Sとセット販売のものです。
実は、10回線目。そして、いちおうソフトバンクの回線なので、これで全キャリアの端末を持っていることになったり。まあ、基本的にパケットはOFFのまま、Wi-Fiでの運用ですが。


5インチサイズでそこそこ大きくそれなりの情報量を表示できるし、電池持ちもそこそこ良いのでなかなか使えます。
用途については、贅沢にも家専用の端末として使用中。すぐ出かける予定が決まっている時など、持ち出す端末を持ち歩くと電池が減ってしまうので、なるべく充電させたままにしたい。そんなときにStreakを持ち歩けば良いので、結構便利です。サイズも手頃ですし、屋内でちょっとした情報を確認したり、屋内で持ち歩いたりするのには割とぴったりな端末です。あとはもう少しPCの補佐として使えるようなアプリケーションをそろえればもっと使えそう。
ホームアプリこそDell Stageウィジェットという独特のウィジェットが使える特殊なホームを使っていますが、それ以外はびっくりするほど普通のAndroid2.2端末。ノーティフィケーションバーのカスタマイズなどはないし、設定メニューなどの構成もそのまま、端末によっては削除されていることもあるデータのバックアップや自動復元の項目もちゃんとあります。おかげで同じく機能が削除されていなかったe-mobile Pocket Wi-Fi Sの設定やアプリが流れ込んできました。


しかし、思うのは、ほんとこれ「単品で販売すれば良かったのに」ということ。DELLなら日本国内でも販路を持っているし、DELLの端末愛好家であればたぶん買ってもおかしくないものだと思います(正直わたしも、昔DELL AximX50Vを買ったときと似たものを感じています)。
そして、ソフトバンクはこれを売って何がしたかったのか。Androidとしてはあまりにもノーカスタマイズで、ソフトバンクが「携帯電話として」どういう層に売りたかったのか というのが想定できませんでした。
どうみてもこれはスマートフォン というより、電話が出来るPDAという感じ。たしかに「ほとんど電話はしないからとりあえず電話はおまけであればいい」という人もいるにはいると思いますが、それはソフトバンクが(本来携帯電話事業としてつながりのないDELLと連携してまで)狙いたい層だったのかなあ?と。しかもまだスマートフォンという分野が流行るかどうかも分からない当時の状況で。
まあいろいろ事情があるのかもしれませんし、なんともいえませんが。


まあ、ともあれ、Streak自体は、今の段階でも十分に使うことが出来ると思います。Android2.2という一世代前のOSではありますが、PDAとしては十分に使えるはず。ポケットに入るサイズのタブレットとして持ち歩くでもいいし、家において卓上端末として使うでもいいし。

AndroidのTTSを使ってみた

Androidは1.6からTextToSpeech(以下TTS)という文字列の音声読み上げ機能がついています。
読んで字のごとく、このTTSに何らかの文字列を渡すと、その文字列を読み上げてくれるという機能。別途エンジンを指定することで様々な言語をしゃべることができるというもので、初期(エンジンがない場合、インストールを促されるエンジンのみ)状態では、英語、ドイツ語、フランス語、イタリア語に対応しています。有料ですが日本語のエンジンも製作されている模様。

で、このTTSを使って現在の時刻読み上げプログラムを作ってみたわけです。

まだまだこれだけの機能しかないですが、ひとまず毎時0分や30分の時報を鳴らす機能を作ってみようかな と(ちなみにソースコードGoogle Codeに配置してあります。興味があればどうぞ)。

プログラムの際に注意すべきことはあまりなし。ひとまずプログラムが始まったらTTSオブジェクトのInitを呼び出して、初期化が終わったらSpeakすればいいだけ。
ただしそこはAndroid、基本的にすべての動作は非同期で動作します。なのでメインスレッドで呼び出してもUIの処理は止まらず、読み上げ処理と並行して動作します。なのでTTSがしゃべってる間にアクティビティを終了させるようなことをしてはいけませんよ と。今回は検索ボタン長押しからの起動で、「時刻読み上げだけして終了する」という機能を作って、それでちょっと詰まった。

Androidのアプリ作り自体は簡単ですが、基本的に非同期で動作する処理が多いため、そこだけは気を付けないといけないなと思いました。

Androidのinputコマンド

また会社で知ったこと。
Androidにはinputコマンドというコマンドがあり、それに引数を渡すことで任意のキーコードを処理させることができます。
たとえば、adbからなら

  adb shell input keyevent 3

というコマンドを送信することで、端末のホームキーを押下したのと同じ効果を得ることができます(3はホームキーのキーコード。オプションのkeyeventは、第二引数がキーコードの数値であることを示す値)。
なお、このinputコマンドはもちろんアプリから実行することもできて、

  Runtime.getRuntime().exec("input keyevent 3");

とやれば、アプリからでもinputコマンドが実行できます。
他に任意のキーイベントを送るのはInputMethodService(要するにIME)の持っているメソッドしかないみたいなので、便利かも*1
まあ、デバッグのお供に使うのが順当かもしれませんけどね。


ところで、キーの入力ができるので、あとはフリック操作ができれば完璧だと思うのですが、そんなコマンドはないんですかね。

*1:ちなみにこのコマンドを見つけたときはInputMethodService.sendDownUpKeyEvents()メソッドとかを必死にいじり回していたとき。わ、わたしの二日間の努力はいったい…

IS03購入

そういえば書き忘れていましたがIS03を購入しました。スマートフォン懇親会の翌日に。これでやっとAndroidで通話できます(いままではWindows MobileのSC-01Bだった)。

所感

使ってみた感じ、思った以上にいい感じです。いままでスマートフォンとしてはHT-03Aというスペック的に数世代前の端末しか使ってなかったせいもあるでしょうが、おおむね高速に動作します。まあ、標準のホームアプリについては、いれかえさせていただきましたが・・・(IMEも入れ換え検討。母にメールをするときは絵文字が使える標準IMEも使うでしょうが)。

電話もいまのところは安定しているし、近接センサーのお陰で耳に近づけると液晶が消える。なかなか使えるレベルかなと思います。
イヤホンジャックがついているし音楽再生もいけますが、そのわりに音楽再生機能が弱い(LISMO Playerかなぜかアプリとしては非表示になっているAndroid標準プレイヤーしかない。どちらもとりあえずプレイリスト再生ができる程度で、再生機能のカスタマイズ幅がかなり狭い)のですが、それはソフトを探せばいいレベルでしょうか。

電池

当初一番の懸念点だった電池についても、HT-03Aに比べるとよい といったところ。HT-03Aはバッテリーを節約*1して半日(平日一日仕事から帰るまで)ギリギリ持つレベルでしたが、IS03は節約を全くしない状態*2で同じくらい持ちます。
それだけにもうちょっと頑張ればいい線行けるのになあ と欲張りたくはなりますが、とりあえず問題なし。

充電バッテリーのモバイルブースター(500mAh版)も、起動しているアプリにもよりますがちゃんと使えるようです(ただ起動しているアプリやモバイルブースターの状態によっては充電ができないことがあるので、余裕をもって1Ah版のモバイルブースターがほしいところです)。

Android2.1

OSはAndroid2.1ベースと、同じく手持ちのGalaxy Tabより低いバージョン。しかし、それもいまのところはあまり気になりません。
Flashもケータイ用のものがつまれているお陰でそこそこ見えますし、アプリの実行速度も気になるほど遅くはない(まあ、わたしはゲームをやらないのもあるでしょうが)。

アプリの対応も2.1以降のものが多くあまり困らないし、クラウドからのメッセージ送信ができるC2DMはそもそもまだ流行っていない。
むしろライブ壁紙など見た目に大きな影響を与える機能は2.1で大抵実装済みなので気にするレベルではありませんでした。
実際いまはGalaxy Tabと見比べて使っていることもありますが、とくにこれができないのは… と思うところはないです。

感想

わたしは早く母との通話とそれ以外の通話をひとつにしたい*3というのと、おサイフケータイなどの和製サービスへの興味、見た目に惹かれてこれを選びましたが、おおよそ外れではなかったと思います(まあ、バッテリーなど他と比べると見劣りする点も多々あるとは思いますが)。
現状ほどほどのスペックで動き、日本のサービスも見てみたい という人は選んでもいいかな と思います。


というわけで、ひとまず普段使いの端末がそろいました。今年の大きな買い物はこれでおしまいかな。

*1:画面輝度20%、使用しないときはTwitterクライアントなどを終了して節電

*2:ライブウォールペーパーあり、画面輝度は自動設定、Twitterクライアントは停止せず、3分に一回通信

*3:前にも書いたと思いますが、うちは母がauなので、いままで母とはIS01、外向けにはSC-01B という使い方をしていた

IS01でプログラミング

最近バージョンアップ断念の報道もあっていろいろ言われているIS01ですが、個人的には結構便利に使ってます。今回のようなブログの原稿書きだったり、ブログやサイトの確認だったり。

そのほかにももうひとつ、IS01だからこそできる面白い使い方もできます。


それは、「プログラミングに使う」こと。
もともと海外ではDROIDなどのキーボード内蔵端末が多いからか、Androidマーケットで「Interpreter」などと検索すると結構いろんなものが出てきます。
別にハードキー専用というわけではありませんが、ハードキーがないとあまりうまく使えない性質のものだと思うので、IS01を持ってるなら是非一度使ってみてほしいところです。

で、もっともパッと見わかりやすかったのは、AndroidLogoというアプリ(上でああ書いておいて、いきなりInterpreterでヒットしないアプリではあるのですが)。これはLOGOという言語のインタプリタで、簡単なコーディングで簡単な線画がかけるというもの。これをIS01の大画面とフルキーボードで遊べるのはなかなか楽しいです。


このようなアプリは現状Android上で楽しむだけで今一つ実用性には欠けますが、なかなかあって面白いものだと思います。このサイズのポケットコンピュータが10000円弱(最近の新規購入価格の7800円+新規契約事務手数料2100円の価格です。最近は安値で販売している店舗も減っているようですので)+月額8円で買えると思えば、かなり安い買い物といえるのではないでしょうか。結局auの回線を使用しない運用になってしまうのでちょっと心苦しくはありますが(まあ、近くIS03も買うので許してね とw)。

ただ、使い方次第でなかなか使える優秀な端末ですし、au発で販売する必然性があまりない端末ともいえます。姉妹機のJN-DK01のように、一般販売端末として売り出してしまってもよかった気がしますね(まあ、JN-DK01はちょっと高すぎたとは思いますが)。