0

Flash Player は 11.5+ でスレッドをサポートしました。

Worker Thread で Loader.loadBytes() を使用して画像を読み込みたい。

メインスレッドで生成される Image ByteArray。

しかし、私はそれを行うことはできません。

次のような SecurityError を受け取りました。

SecurityError: エラー #2123: セキュリティ サンドボックス違反: Loader.content: file:///E:/​​work/ASWorkSpace/test/bin-debug/test.swf は file:///E:/​​work/ASWorkSpace/test にアクセスできません/bin-debug/test.swf/[[DYNAMIC]]/1. アクセス権が付与されたポリシー ファイルはありません。

次のようにワーカースレッドを初期化します。

worker = WorkerDomain.current.createWorker(this.loaderInfo.bytes);

リモートからのswfではなく、ローカルなどです

[Embed(source="../workerswfs/Thread.swf", mimeType="application/octet-stream")]

マニュアルで見つけました。「ロードされたコンテンツが画像の場合、SWF ファイルのドメインが画像のオリジン ドメインの URL ポリシー ファイルに含まれていない限り、セキュリティ サンドボックスの外部にある SWF ファイルからそのデータにアクセスすることはできません。」

私は解決策を得ました。loadByte() を 2 回実行すると、ByteArray ソースが「洗い流された」ように見えます。そのため、FlashPlayer は Worker Thread によって生成された ByteArray と見なされ、loader.content へのアクセスが許可されました。このような:

            //Messages to the Main thread
        protected function onMainToWorker(event:Event):void {
            var msg:ByteArray = mainToWorker.receive() as ByteArray;
            trace(msg.length);
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, bytesComplete);
            var bytes:ByteArray = new ByteArray();
            bytes.writeBytes(msg,0,msg.length);
            loader.loadBytes(bytes);
        }

        private function loadedAagin(e:Event):void
        {
            var loader:Loader = (e.target as LoaderInfo).loader;
                    // Here we can access it.
            var bmp:Bitmap = loader.content as Bitmap;
        }
        private function bytesComplete(e:Event):void
        {
            var loader:Loader = (e.target as LoaderInfo).loader;
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, bytesComplete);

            // var bmp:Bitmap = loader.content as Bitmap;  It can not be accessed
            // just loadBytes again, it seems "washed off" the ByteArray source

            var newloader:Loader = new Loader();
            newloader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadedAagin);
            newloader.loadBytes(loader.contentLoaderInfo.bytes);
        }

しかし、それはとても醜いですよね?誰か良い考えがありますか?

4

0 に答える 0