2013-02-25 121 views
0

**我有一個針對iOS的空中應用程序,我一直在開發。我試圖捕獲一張圖片,將文件保存到存儲目錄(不是相機膠捲),並將文件名保存在sqlite數據庫中。iOS在flashbuilder空中移動應用程序中使用CameraUI保存圖像

我已經嘗試過這麼多不同的變化,但是當涉及到寫入文件流來保存應用程序掛起。在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; 
     } 

回答

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; 

     } 
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如果發生任何錯誤會趕上。

+0

其實我也嘗試了異步方法。它仍然產生了相同的結果。 try catch塊讓我看看在寫作過程中是否出現錯誤。但我當然非常感謝他們的幫助 – 2013-02-25 14:24:17

相關問題