2012-01-02 9 views
0

私は、base64コンバータを使用してカメラで撮影したJPEG画像を変換し、結果をsqliteデータベースに(MEDIUMBLOBとして)アップロードする必要があるフレックスアプリケーションを使用しています。コードは次のようになります。画像のjpeg画像を使用するとFlexのAndroidアプリケーションが中断されます

MXML宣言:絵とconvertionを取るための

 <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をDBに正しくコピーしますが、写真が撮られたか撮影され削除された場合、プログラムはハングアップします(アンドロイドはそれを閉じるか待つかを尋ねます)。私は撮影した写真のサイズを確認しており、MEDIUMBLOBのサイズを超えていません(写真は約2メガバイトあります)。何が間違っていますか?

答えて

0

あなたの説明から私の最初の考えは、「ブレークポイント」です。私の電話が私にそのメッセージを伝える唯一の時間は、私がデバッグしているときで、それはあまりにも長い間ブレークポイントに止まってしまったときです。それはちょうどコピーエラーの可能性がありますが

あなたはMediaPromise

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

としてあなたevent.dataをキャストすることがあります。

画像データを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エンコードをしたいし、それが問題を作成していない場合、私はまだ保存するには、このようなコードをリファクタリングを示唆していますブランチがビットマップデータのソースである場合は、2つの間で変化する唯一のものであるため、複製が必要です。

ただし、これは最初のスタブです。コードを一括して見ると便利です。私は、encodedBytesはクラス全体で利用可能なStringであると仮定していますか?私はどのように/ AddHandlerが呼び出されたかを見ることができないので、変数の状態が呼び出されたときに変数の状態を伝えることもできません(問題に関連する可能性があります)。また、AddHandlerが完了した後に何が起きているのかを知ることも有用です。ハングアップしているinsert文の後にエラーが発生している可能性があります。

デバッグしてエラーを共有しましたか?

私はその投稿が1ヶ月前であることを知っています。だから、あなたはすでにそれを理解しているかもしれません。たぶんあなたはそれを共有して、他の人たちが同じミスをしないようにすることができます。いずれにしても、これが誰かを助けることができれば幸いです。

+0

まあ、実際には私はずっと前にこのプログラムを終了し、写真の機能をそれほど重要ではないものとして無効にしました。とにかく、データベースに2つのソース(プログラムとウェブサイト)からの画像が供給され、コード化されているためにエンコードされていないBLOBをウェブでアップロードすることはできないため、base64が使用されました。それでも、私はflexが自動的にエンコーディングを行うことを知らなかったので、情報に感謝します。 – kyooryu

+0

ええ、問題ありません。 = D – Chaos7703

関連する問題