iOS使用相机在flash builder air mobile app中保存图像

时间:2013-02-25 00:18:04

标签: ios actionscript-3 air flash-builder

**我有一个我正在开发的iOS应用程序。我正在尝试捕获图片,将文件保存到存储目录(而不是相机卷),并将文件名保存在sqlite数据库中。

我尝试了很多不同的变体,但是当编写文件流来保存应用程序时。在iPad上进行测试3.是否有人提出建议?这让我疯了好几天。我在网上搜索过但我很难过。**

      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;
        }

2 个答案:

答案 0 :(得分: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。对于处理错误,如果发生任何错误,IOErrorEvent将捕获。

答案 1 :(得分: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;

        }