aneを使ってAir for iOS(AIR3.3SDK)でスクリーンショットを撮るお話。

ありそうでなかった、というかあったけどもうまく動かなかったので作ってみたらちょっとハマりました。


まず、タイトルどおりのaneのコードが公開されてました。
abhisek-mishra / ScreenShot

が、実装してみても想定通りに動作しない。。
Objective-C部分のコードを見てみると、UIGetScreenImage()というapple非公開APIを使用してる。
非公開APIを使うとリジェクト対象だそうでこれは使えないと。


とりあえず下の記事を参考にスタンダードな実装に変更してみる。
iPhoneアプリから画面のキャプチャー画像を取得する2つの方法

aneファイルをビルドしなおして再テスト。
が、画像はカメラロールに保存されたのは真っ白の画像。。

ちなみにObjective-CでiOSプロジェクトを作って、Xib上に適当にボタンとか画像とか配置した状態で上記の方法を実行すればスクリーンショットは問題なく取れるから根本的に間違ってるわけではなさげ。


肝はFlashの描画領域がどこにあるのか、ということ。
上記の記事のコードだと、

[app.keyWindow.layer renderInContext:UIGraphicsGetCurrentContext()];

UIWindowのkeyWindowのレイヤーをキャプチャしてるのだからFlashで言えばStage上のメインタイムラインをキャプチャしてるようなものなはずだから良さげな感じだけども結果は前述したとおりに真っ白。


で、結論。
上記の方法は使えないみたい。
app.xmlでのrenderMode要素をdirectを指定する場合はObjective-C側ではOpenGLESでのスクリーンショットを撮るような処理をしないといけないっぽい。
具体的なコードはここに書かれてるものを参考にしました。
GLPaint save image

このコードで取得したUIImageをキャプチャすることでとスクリーンショットを撮ることができました。


では、renderModeをcpu指定にすれば最初のコードでもスクリーンショットは撮れるのではないか?と思いましたが結果は否。
renderMode:cpuでは、上述のどちらのコードでもスクリーンショットを撮ることはできませんでした。
謎。。。
まぁrenderModeをcpuにする理由なんてない気もするのでまぁいいか。


各コードの詳細はQuiitaにあげてあります。
Qiita:AIR for iOSでスクリーンショットをカメラロールに保存するANEを作ってみたけど真っ白な画面しか取れない
(コメント欄で自己解決してます)

p.s.
ちなみに今回スクリーンショットを撮るのが最終目的ではなく、iOS5からのネイティブなTwitterAPIを使ってのスクリーンショットつきのTweet機能を実装したかったのでした。
これも無事にうまく実装できたので、また後で記事を書きます。