T

Android用モジュールを作ろう

とかいう記事を書くつもりでしたが、実際に作ってるのを見た方が早くいろいろ覚えられます。

面白いことにTitanium MobileのAndroidの場合、Ti.Mediaなどいろいろなところが実はモジュールとして実装されているので、Githubandroid/modulesのソースで使われている方法がそのまま使えます。

Intentを起動してコールバックを指定するとか、Intentを起動するだけとか、ごく普通に関数を実行するとかのサンプルはこちらをどうぞ。

Titanium MobileでAndroidでカメラ

1.7系になってからAndroidのカメラ機能では問題続きのTitanium Mobileですが、iOSに実装されている、撮影した画像を切り取ってそこだけ保存するCROP機能が欲しかったのでモジュールを作ってみました。

が、公開はもう少し先になります。理由は、これから述べます。

まず、SDK2.3以上では動作したのですが、2.2では動きませんでした。どれくらい動かないかというと、うんともすんともいいません。どうやらonActivityResultがカメラの場合ちゃんと発動しないケースがあるらしく、たぶんマルチスレッドの処理に問題があるんだと思います。そのため、Titanium.Media.showCameraのsuccessでcom.android.camera.action.CROPを呼び出そうとしても、successがちゃんと呼ばれないのでどーしよーもないのです。

そこで、カメラもTitaniumで用意されているものではなく自前でAndroidのAPIを叩いて作ってしまって、そのonActivityResultでああだこうだしようと方針を転換しました。公開が先になるのは、この変更のためです。

もうね、ヘトヘトですよ。同じ苦労を味わっている方、お察しします。

TitaniumでMIMEタイプ別に外部アプリを起動

Androidの仕組みで、URLとMIMEタイプを渡して暗黙のIntentを呼び出すと、可能であればそれに即した外部アプリが選ばれるというのがあった。例えば、video/mp4を指定してファイルのURLを渡すと動画プレーヤーが起動する(複数インストールされていれば選択画面がポップアップする)。

TitaniumだとTitanium.Platform.openUrlがそれに近いのだが、Chromeが起動するようになっていた。というわけで、関数一個だけ用意すればいいのだからちゃっと作って公開しておいた。

OpenUrlWithType

使い方は簡単、まず上のリンクからソースコードを取得して、OpenUrlWithTypeディレクトリで

$ ant
$ ant run

すればサンプルアプリケーションが起動する。distディレクトリが出来ているはずなので、そこにあるzipファイルをTitaniumのプロジェクトディレクトリ直下に置き、tieapp.xmlに

<modules>
  <module version="0.1">org.selfkleptomaniac.ti.openurlwithtype</module>
</modules>

こんな感じでモジュールを追加する。

JavaScriptからの呼び出しは

var open_url_with_type = require('org.selfkleptomaniac.ti.openurlwithtype');
open_url_with_type.openUrlWithType('http://www.example.com/great_movie.3gp', 'video/mp4');

こんな風に指定する。video/mp4でしか動かしてないので、いろいろ機能があった方がいい人はforkしてください。