放置状態だった「FLASHで作る AIRアプリケーション レシピブック」を再開。この中にファイルをデスクトップ等にドロップして保存するサンプルがあるのだけれど(RECIPE 003)、これを自分で書いてみたら、うまく動かなかった。
具体的には初回のみ成功して、2回目以降はNG(Finder側に移動不可マークが出る)。ムービープレビューをやり直しても、Flashを再起動してもダメで、OSを再起動しないとうまくいかない(それでもOS再起動後1回のみで、あとはNG)。
具体的なファイル保存の方法は・・・
1.一時ディレクトリを作成(File.createTempDirectory())
2.一時ディレクトリに保存ファイルを作成(File.resolvePath())
3.FileStreamで保存ファイルにBitmapDataを書き込み(FileStream.writeBytes())
とファイルを作っておいて、ファイルをドラッグ開始したときに
1.クリップボードに保存ファイルをセット(Clipboard.setData())
2.ドラッグ処理を設定(NativeDragManager.doDrag())
して、ドラッグ完了時に・・・
1.クリップボードの保存ファイルが、ドロップした場所に移動する
(NativeDragActions.MOVE/自動で行われる)
2.一時ディレクトリを削除する(File.deleteDirectory(true))
という手順になっています。
いろいろ調べてみると、どうも一時ディレクトリで引っかかっているようで、一時ディレクトリの削除をはずすと問題なく動作する。削除自体はエラーにならないけど、ちゃんと解放されていないとか、そんな感じなのかな?
ただ一時ファイルは削除しないと新規に作られ続けるので、明示的にディレクトリを作って、それを削除する方法に変更した。具体的には・・・
1.File.desktopDirectoryとFile.resolvePath()を使って、明示的なディレクトリを作成
(File.createDirectory())
2. 明示的なディレクトリを削除する(File.deleteDirectory(true))
という感じに変更しました。
テスト環境はMacOSX10.5.8+Flash CS4です。サンプルファイルのAIRでも同様でした。但し知人にWindows Vista+Flash CS3で試してもらったところ、問題なく動作したらしい。OSXの問題なのか、AIR1.5なのか、CS4なのか…。特定できませんでしたが、とりあえず対処できたので良しとします。
書籍のサンプルファイルはサポートページからダウンロードできるので、気になる方は試してみて下さい。もし何かわかったら教えて下さい。