0

**開発中のiOS用のairアプリがあります。写真をキャプチャし、ファイルをストレージ ディレクトリ (カメラ ロールではない) に保存し、ファイル名を sqlite db に保存しようとしています。

私はこれについて非常に多くのバリエーションを試しましたが、アプリを保存するためのファイルストリームの書き込みに関してはハングします。iPad 3 でテストしています。誰か提案はありますか? これは何日も私を夢中にさせてきました。Web を検索しましたが、困惑しています。**

      public var temp:File; // File Object to save name in database
        protected function selectPicture():void
        {
            
            myCam = new CameraUI();
            myCam.addEventListener(MediaEvent.COMPLETE, onComplete);
        
            myCam.launch(MediaType.IMAGE);
        }
        
        
        protected function onComplete(event:MediaEvent):void {
        
        //imageProblem.source = event.data.file.url;
        
            var cameraUI:CameraUI = event.target as CameraUI;
            
            
            var mediaPromise:MediaPromise = event.data;
            
            var mpLoader:Loader = new Loader();
            mpLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMediaPromiseLoaded);
            
            mpLoader.loadFilePromise(mediaPromise);
            

        }
        
        private function onMediaPromiseLoaded(e:Event):void
        {
            var mpLoaderInfo:LoaderInfo = e.target as LoaderInfo;
            mpLoaderInfo.removeEventListener(Event.COMPLETE, onMediaPromiseLoaded);
            
            this.imageProblem.source = mpLoaderInfo.loader;
            
        
            var stream:FileStream = new FileStream();
            
            stream.addEventListener(Event.COMPLETE, showComplete);
            stream.addEventListener(IOErrorEvent.IO_ERROR, showError);
            
            
            try{
                
            this.messages.text = "Starting";
                
            stream.open( temp, FileMode.WRITE );
            stream.writeBytes(mpLoaderInfo.bytes);
            stream.close();
            
            }catch(e:Error){
            
                this.messages.text = e.message;
            
            }
            
            
        
        
        
        }
        
        protected function showError(e:IOErrorEvent):void{
            
            this.messages.text = e.toString();
            
            
        }
        
        protected function showComplete(e:Event):void{
            
            this.messages.text = "Completed Writing";
            this.imgName.text = temp.url;
            imagefile = temp;
            deleteFlag = 1;
        }
4

2 に答える 2

0

ようやくこれが機能するようになりました。コードに以下のコメントを追加して、機能しない理由を説明しました。

                    public var temp:File;
        protected function selectPicture():void
        {

            myCam = new CameraUI();
            myCam.addEventListener(MediaEvent.COMPLETE, onComplete);

            myCam.launch(MediaType.IMAGE);
        }


        protected function onComplete(event:MediaEvent):void {

        //imageProblem.source = event.data.file.url;

            var cameraUI:CameraUI = event.target as CameraUI;


            var mediaPromise:MediaPromise = event.data;

            var mpLoader:Loader = new Loader();
            mpLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMediaPromiseLoaded);

            mpLoader.loadFilePromise(mediaPromise);


        }

        private function onMediaPromiseLoaded(e:Event):void
        {
            var mpLoaderInfo:LoaderInfo = e.target as LoaderInfo;
            mpLoaderInfo.removeEventListener(Event.COMPLETE, onMediaPromiseLoaded);

            this.imageProblem.source = mpLoaderInfo.loader;




                /// Here was the solution

                var bitmapDataA:BitmapData = new BitmapData(mpLoaderInfo.width, mpLoaderInfo.height);
                bitmapDataA.draw(mpLoaderInfo.content,null,null,null,null,true);  

                /// I had to cast the loaderInfo as BitmapData 

                var bitmapDataB:BitmapData = resizeimage(bitmapDataA, int(mpLoaderInfo.width / 4), int(mpLoaderInfo.height/ 4));  // function to shrink the image





                var c:CameraRoll = new CameraRoll();
                c.addBitmapData(bitmapDataB);

                var now:Date = new Date();
                var f:File = File.applicationStorageDirectory.resolvePath("IMG" + now.seconds + now.minutes + ".jpg");                                    
                var stream:FileStream = new FileStream()
                stream.open(f, FileMode.WRITE);                                         

                // Then had to redraw and encode as a jpeg before writing the file


                var bytes:ByteArray = new ByteArray();
                bytes = bitmapDataB.encode(new Rectangle(0,0, int(mpLoaderInfo.width / 4) , int(mpLoaderInfo.height / 4)), new JPEGEncoderOptions(80), bytes);




                stream.writeBytes(bytes,0,bytes.bytesAvailable);
                stream.close(); 

                this.imgName.text = f.url;


            imagefile = f;
            deleteFlag = 1;

        }
于 2013-02-25T14:22:13.100 に答える
0

でファイル操作を使用しようとしているため、アプリケーションがハングしますSync mode

Async Mode同期モードのファイル操作の代わりに操作を使用する必要があります。

stream.openAsync( temp, FileMode.WRITE );

これで試してください

var stream:FileStream = new FileStream();
stream.addEventListener(Event.COMPLETE, showComplete);
stream.addEventListener(IOErrorEvent.IO_ERROR, showError);
stream.openAsync( temp, FileMode.WRITE );
stream.writeBytes(mpLoaderInfo.bytes);
stream.close();

非同期操作を使用する場合は、使用する必要がないことに注意してくださいtry catch

于 2013-02-25T05:00:30.837 に答える