1

AS3とAIRを使用しているiOSアプリがあります。サーバーから外部swfsをダウンロードして正しく再生していますが、これはすべて問題なく機能します。

ただし、ユーザーがアプリを起動するたびにこれらのswfをダウンロードする必要はないので、swfを初めてダウンロードした後、ディスクに保存します。そうすれば、将来必要になったときに、再度ダウンロードする代わりに、ローカルコピーからロードできます。AS3にファイルを保存するためのこの例をオンラインで見つけました。

var file:File = File.applicationStorageDirectory.resolvePath("Swfs/" + "mySwfName" + ".swf");
var wr:File = new File(file.nativePath);
var stream:FileStream = new FileStream();
stream.open(wr, FileMode.WRITE);
stream.writeBytes(SWF_FILE_GOES_HERE, 0, SWF_FILE_DATA_LENGTH_GOES_HERE);
stream.close();

問題はwriteBytes列にあります。私が見つけたサンプルは、画像をディスクに保存するためのものであり、その行は次のようになっています。

stream.writeBytes(imageData, 0, imageData.length);

しかし、画像ではなくswfに対してこれを行う必要があり、swfファイルから必要なデータを取得する方法がわかりません。swfファイルの保存、swfファイルからのデータの取得などをオンラインで検索しましたが、何も見つかりませんでした。swfのデータとデータ長を取得する必要があります(これはバイト数だと思いますか?)。誰かが以前にこの問題を解決したことがありますか、または彼らが私を方向付けることができるリソースを持っていますか?


更新:@LondonDrugs_MediaServicesのコメントに基づいて、私は次のwriteBytes行を理解しました:

stream.writeBytes(mySwf.loaderInfo.bytes, 0, mySwf.loaderInfo.bytesTotal);

これは、エラーなしでコンパイルおよび実行される限り、機能しているようです。しかし、ファイルを取得してムービークリップに戻そうとすると、次のエラーが発生します。

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.

これは、ファイルが実際には正しく保存されなかったことを意味します。ただし、ファイルの場所を印刷すると、正しいように見えます。ファイルをapplicationStorageDirectoryに保存すると、次のようになります。

/Users/MyName/Library/Preferences/com.appdir/Local Store/Swfs/mySwName.swf

そして、それをストレージからムービークリップにロードしようとしたときのファイル名:

/Users/MyName/Library/Preferences/com.appdir/Local Store/Swfs/mySwName.swf

これは、ムービークリップにロードして戻すために使用しているコードです。

var videoFileName:String = "Swfs/" + ENVAR.currentVideoSelected + ".swf";
var videoFilePath:File = File.applicationStorageDirectory.resolvePath(videoFileName);   
var inFileStream:FileStream = new FileStream(); 
trace("[Loading] filepath: ", videoFilePath.nativePath);
inFileStream.open(videoFilePath, FileMode.READ); 
var fileContents:String = inFileStream.readUTFBytes(inFileStream.bytesAvailable);   
inFileStream.close(); 

var req:URLRequest = new URLRequest(videoFilePath.nativePath);
var mLoader:Loader = new Loader();
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onVideoLoadComplete);
mLoader.load(req);

そして、私のonVideoLoadComplete関数には次の行が含まれています。

var myMC:MovieClip = e.target.content as MovieClip;
addChild(myMC);

しかし、私はそのエラー2044を受け取り、ファイルが存在するとは思われません。誰かが問題を見つけることができますか?ありがとう!

4

1 に答える 1

2

パラメータを使用して、ロードされたswfファイルの生のバイトを取得でき loaderInfo.bytesます。あなたの例では、これを行うことができます:

var file:File = File.applicationStorageDirectory.resolvePath("Swfs/" + key + ".swf"); 
var wr:File = new File(file.nativePath); 
var stream:FileStream = new FileStream(); 
stream.open(wr, FileMode.WRITE); 
stream.writeBytes(mySwf.loaderInfo.bytes, 0, mySwf.loaderInfo.bytesTotal); 
stream.close(); 

次に、ムービークリップに戻すには:

var videoFileName:String = "Swfs/" + ENVAR.currentVideoSelected + ".swf";
var videoFilePath:File = File.applicationStorageDirectory.resolvePath(videoFileName); 
var inFileStream:FileStream = new FileStream(); 
inFileStream.open(videoFilePath, FileMode.READ); 
var swfBytes:ByteArray = new ByteArray();
inFileStream.readBytes(swfBytes);
inFileStream.close(); 

var mLoader:Loader = new Loader();
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loaderContext.allowCodeImport = true;
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onVideoLoadComplete);
mLoader.loadBytes(swfBytes, loaderContext);
于 2012-08-31T22:10:12.170 に答える