Приложение Flex для Android приостанавливается при использовании изображения JPEG - PullRequest
0 голосов
/ 02 января 2012

У меня есть гибкое приложение, в котором я должен конвертировать JPEG-изображение, сделанное камерой, используя конвертер base64, а затем загрузить результат в базу данных sqlite (как MEDIUMBLOB). Код выглядит так:

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

Теперь, если изображение не было сделано, программа корректно загружает skins / PhotoNotAvailable.jpg в БД, но если изображение было снято, снято и удалено, программа зависает (android спрашивает, закрыть ли его или подождать). Я проверил размер сделанных снимков, и он не превышает размер MEDIUMBLOB (размер картинки около 2 МБ). Что может быть не так?

1 Ответ

0 голосов
/ 24 февраля 2012

Моя первая мысль из вашего описания того, что происходит, - это «точка останова».Единственный раз, когда мой телефон выдает мне это сообщение, это когда я отлаживаюсь и он слишком долго останавливается на точке останова.

Вы можете преобразовать ваши 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.Возможно, это ошибка, возникающая после зависания оператора вставки?

Вы отладили его и получили какие-либо ошибки, чтобы поделиться?

Я знаю, что посту уже месяц, так что, возможно, вы ужедогадаться.Может быть, вы могли бы поделиться этим, чтобы другие не сделали ту же ошибку.В любом случае, я надеюсь, что это может кому-то помочь.

...