2012-01-02 57 views
0

我有一個flex應用程序,我必須使用base64轉換器轉換相機拍攝的jpeg圖片,然後將結果上載到sqlite數據庫(如MEDIUMBLOB)。代碼如下所示:使用jpeg圖像時Flex Flex應用程序暫停

圖像的MXML聲明:

 <s:Group width="480" height="304"> 
      <s:Label x="0" y="0" width="100%" height="34" backgroundColor="#4D4D4D" 
        color="#FFFFFF" fontSize="30" text=" Select photo" verticalAlign="middle"/> 
      <s:Image id="image" x="10" y="42" width="217" height="246" /> 
      <s:Image id="image2" x="10" y="42" width="217" height="246" source = "@Embed(source='skins/PhotoNotAvailable.jpg')"/> 
      <s:Button x="235" y="42" width="235" height="84" label="Take a Picture" 
         click="captureImage(event)" enabled="{CameraUI.isSupported}" fontSize="30"/> 
      <s:Button x="235" y="150" width="235" height="70" label="Delete" 
         click="deletePhoto(event)" fontSize="30"/> 
     </s:Group> 

腳本用於拍照和皈依:現在

//Taking the pictures 

     protected function application1_applicationCompleteHandler(event:FlexEvent):void { 
      image.setVisible(true); 
      image2.setVisible(false); 
      if (CameraUI.isSupported){ 
       var mediaPromise:MediaPromise; 
       camera = new CameraUI(); 
       camera.addEventListener(MediaEvent.COMPLETE, onComplete); 
       camera.addEventListener(ErrorEvent.ERROR, onError); 
      } else { 
      } 
     } 

     protected function view1_activateHandler(event:Event):void 
     { 
      conn = data as SQLConnection; 
     } 

     private function captureImage(event:MouseEvent):void { 
      camera.launch(MediaType.IMAGE); 
     } 
     private function onError(event:ErrorEvent):void { 
      trace("error has occurred"); 
     } 
     private function onComplete(event:MediaEvent):void { 
      var mediaPromise:MediaPromise = event.data; 
      image.source = mediaPromise.file.url; 
      pictureTaken = true; 
     } 

//Convertion and uploading to database 

protected function AddHandler(event:MouseEvent):void 

//irrelevant code skipped 

       insertStmt = new SQLStatement(); 
       insertStmt.sqlConnection = conn; 
       var insertSQL:String = ("INSERT INTO RecipeDB (RecipeID, Name, Category, Origin, Recipe, Favorite, Image)" + "VALUES (:RecipeID, :Name, :Category, :Origin, :Recipe, :Favorite, :Image)"); 
       insertStmt.text = insertSQL; 
        if(pictureTaken) 
       { 
        var jencoder:JPEGEncoder = new JPEGEncoder(75); 
        var imageByteArray:ByteArray = jencoder.encode(image.bitmapData); 
        var baseEncoder:Base64Encoder = new Base64Encoder(); 
        baseEncoder.encodeBytes(imageByteArray); 
        encodedBytes = baseEncoder.toString(); 
       } 
       else 
       { 
        var jencoder:JPEGEncoder = new JPEGEncoder(75); 
        var imageByteArray:ByteArray = jencoder.encode(image2.bitmapData); 
        var baseEncoder:Base64Encoder = new Base64Encoder(); 
        baseEncoder.encodeBytes(imageByteArray); 
        encodedBytes = baseEncoder.toString(); 

       } 
       insertStmt.parameters[":RecipeID"] = ID as int; 
       insertStmt.parameters[":Name"] = NameArea.text; 
       insertStmt.parameters[":Category"] = TypeArea.text; 
       insertStmt.parameters[":Origin"] = OriginArea.text; 
       insertStmt.parameters[":Recipe"] = RecipeArea.text; 
       insertStmt.parameters[":Favorite"] = 0 as int; 
       insertStmt.parameters[":Image"] = encodedBytes; 
       insertStmt.execute(); 
} 

//Deleting photo 
      protected function deletePhoto(event:MouseEvent):void 
     { 
      pictureTaken = false; 
      image.setVisible(false); 
      image2.setVisible(true); 
     } 

,如果沒有圖片拍攝,程序上傳皮/ PhotoNotAvailable.jpg到數據庫正確,但如果圖片被拍攝或採取和刪除,程序掛起(android詢問是否關閉它或等待)。我檢查了拍攝照片的尺寸,並且沒有超過MEDIUMBLOB的尺寸(照片有大約2 MB)。什麼可能是錯的?

回答

0

我首先從你對描述發生的事情的想法是「一個斷點」。我的手機唯一一次給我這個信息是當我正在調試時,它在斷點處停留太久。

你可能會投你event.data作爲MediaPromise

private function onComplete(event:MediaEvent):void { 
     var mediaPromise:MediaPromise = event.data as MediaPromise; 
     image.source = mediaPromise.file.url; 
     pictureTaken = true; 
    } 

雖然這可能只是一個複製錯誤。

據我可以告訴你,不需要base64編碼圖像數據。它已經被編碼並準備好插入到數據庫中。也許「雙重編碼」在某種程度上造成了一個問題。 ???

我會改變

if(pictureTaken) 
{ 
    var jencoder:JPEGEncoder = new JPEGEncoder(75); 
    var imageByteArray:ByteArray = jencoder.encode(image.bitmapData); 
    var baseEncoder:Base64Encoder = new Base64Encoder(); 
    baseEncoder.encodeBytes(imageByteArray); 
    encodedBytes = baseEncoder.toString(); 
} 
else 
{ 
    var jencoder:JPEGEncoder = new JPEGEncoder(75); 
    var imageByteArray:ByteArray = jencoder.encode(image2.bitmapData); 
    var baseEncoder:Base64Encoder = new Base64Encoder(); 
    baseEncoder.encodeBytes(imageByteArray); 
    encodedBytes = baseEncoder.toString(); 
} 

insertStmt.parameters[":RecipeID"] = ID as int; 
insertStmt.parameters[":Name"] = NameArea.text; 
insertStmt.parameters[":Category"] = TypeArea.text; 
insertStmt.parameters[":Origin"] = OriginArea.text; 
insertStmt.parameters[":Recipe"] = RecipeArea.text; 
insertStmt.parameters[":Favorite"] = 0 as int; 
insertStmt.parameters[":Image"] = encodedBytes; 
insertStmt.execute(); 

var jencoder:JPEGEncoder = new JPEGEncoder(75); 
var imageByteArray:ByteArray; 
if(pictureTaken) 
{ 
    imageByteArray = jencoder.encode(image.bitmapData); 
} 
else 
{ 
    imageByteArray = jencoder.encode(image2.bitmapData); 
} 

insertStmt.parameters[":RecipeID"] = ID as int; 
insertStmt.parameters[":Name"] = NameArea.text; 
insertStmt.parameters[":Category"] = TypeArea.text; 
insertStmt.parameters[":Origin"] = OriginArea.text; 
insertStmt.parameters[":Recipe"] = RecipeArea.text; 
insertStmt.parameters[":Favorite"] = 0 as int; 
insertStmt.parameters[":Image"] = imageByteArray; 
insertStmt.execute(); 

如果由於某種原因,你還是想base64編碼,它不是產生問題,我還是會建議重構這樣的代碼保存因爲如果分支是位圖數據的來源,那麼兩者之間唯一不同的東西就會變化。

var jencoder:JPEGEncoder = new JPEGEncoder(75); 
var imageByteArray:ByteArray; 
if(pictureTaken) 
{ 
    imageByteArray = jencoder.encode(image.bitmapData); 
} 
else 
{ 
    imageByteArray = jencoder.encode(image2.bitmapData); 
} 
var baseEncoder:Base64Encoder = new Base64Encoder(); 
baseEncoder.encodeBytes(imageByteArray); 
encodedBytes = baseEncoder.toString(); 

但是,這只是第一次刺傷它。一起看代碼會很有用。我假設encodedBytes是一個可用於整個班級的字符串?我看不到AddHandler是如何/何時被調用的,所以我也無法告訴變量狀態何時被調用(這可能與問題有關)。在AddHandler完成後知道發生了什麼也很有用。也許這是在掛起插入語句之後發生的錯誤?

你調試過,並得到任何錯誤分享?

我知道這個帖子已經有一個月了,所以也許你已經知道了。也許你可以分享它,這樣別人就不會犯同樣的錯誤。無論哪種方式,我希望這可以幫助某人。

+0

呃,實際上我剛剛完成了這個程序,並且完全禁用了照片功能,因爲它很重要。無論如何,因爲數據庫是從2個來源 - 程序和網站提供的圖片中使用base64,並且由於編碼原因,它不會讓我通過網絡上傳未編碼的BLOB。儘管如此,我還是不知道flex會自動進行編碼,所以感謝這些信息。 – kyooryu 2012-02-26 22:00:13

+0

是的,沒問題。 = d – Chaos7703 2012-05-06 05:22:06