T

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');}
});

Posted by on 11月 5, 2011 in Android, Titanium

Comments

  • nya より:

    シングルコンテキストのアプリ上で、app.js以外の場所からなんとか実行できないかと無理矢理app.jsを経由させたりして、色々頑張っているのですがうまくいきません。これは仕様上難しいですかね?

  • y より:

    ええと、app.jsでなくてもシングルコンテクストのアプリであれば実行できます。

  • nya より:

    そうなんですか。
    cropの画面までは行くのですが、successやcancelといったイベントが返ってこない場合は
    どんなことが原因として考えられますか?

  • y より:

    シングルコンテクストになっていない、というのが一番可能性が高いですね。

    コンテクストですが、tabごとに作成され、heavyweightのウィンドウを作成するとそこでもひとつ作成されます。

  • y より:

    !!!再現しました。これ単純にAndroid側で例外を吐いてますね。何が変更になったのが原因かは不明ですが、ddmsを繋ぐとちゃんとエラーを出してました。

  • nya より:

    Android側のエラーなんですかね。
    いくつか実機で確認したんですけど、確認した中ではgalaxy s2だけエラー起きてました。

  • コメントを残す