CropImage
Android用モジュール「CropImage」を公開したまま忘れていました。
iOSのカメラには、撮影後やギャラリーから画像ファイルを選択した後から一部分だけを切り取る機能が用意されています。Ti.Media.showCameraのプロパティにallowEditingを追加するだけでこのAPIを呼び出すことができるのですが、Androidでは正常に動作しません。Android自体はこの機能をサポートしているのですが、どういうわけかOSのバージョンが上がるにつれ引っ込められてしまったようなのです。
とはいえ、今のところ普通に呼び出すことは出来るので、iOSと違ってソースが公開されており、非公開のAPI呼び出しについて制限のないAndroidなら使ってしまおう、というのがこのモジュールです。
注意事項としては、シングルコンテクストでしか動作しません。というのも、Androidのカメラはそうしないとマルチスレッドの扱いがまずいのでfireEventが正しく呼び出されず、撮影後に画像の切り取りを実行しようとしてもそもそもイベントが発火しないから、うんともすんとも動作しないことがあるのです。公開当初から更新してないREADMEには「app.jsで使わないと動かないよ」とか書いてありますね。気が向いたら直します。
使い方は以下の通りです。
function crop_image(e){ var cropImage = require('org.selfkleptomaniac.ti.cropimage'); cropImage.cropper({ success: function(elem){ var imageView = Ti.UI.createImageView({image:elem.media); win.add(imageView); }, error:function(e){alert('failed');}, cancel:function(e){alert('canceled');}, width:width, height:height, image:e.media }); } Ti.Media.showCamera({ success:function(e){ crop_image(e); }, error:function(){alert('error');}, cancel:function(){alert('cancel');} });
Comments
シングルコンテキストのアプリ上で、app.js以外の場所からなんとか実行できないかと無理矢理app.jsを経由させたりして、色々頑張っているのですがうまくいきません。これは仕様上難しいですかね?
ええと、app.jsでなくてもシングルコンテクストのアプリであれば実行できます。
そうなんですか。
cropの画面までは行くのですが、successやcancelといったイベントが返ってこない場合は
どんなことが原因として考えられますか?
シングルコンテクストになっていない、というのが一番可能性が高いですね。
コンテクストですが、tabごとに作成され、heavyweightのウィンドウを作成するとそこでもひとつ作成されます。
!!!再現しました。これ単純にAndroid側で例外を吐いてますね。何が変更になったのが原因かは不明ですが、ddmsを繋ぐとちゃんとエラーを出してました。
Android側のエラーなんですかね。
いくつか実機で確認したんですけど、確認した中ではgalaxy s2だけエラー起きてました。