Как записать изображение в каталог приложения с помощью AIR? - PullRequest
2 голосов
/ 08 августа 2011

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

        var bd:BitmapData = new BitmapData(CANVAS_WIDTH, CANVAS_HEIGHT);
        bd.draw(currentDrawing);
        var jpgEncoder:JPGEncoder = new JPGEncoder(100);
        var ba:ByteArray = jpgEncoder.encode(bd);

        var newImage:File = File.applicationDirectory.resolvePath("images/test.jpg");  
        var fileStream:FileStream = new FileStream();  
        fileStream.open(newImage, FileMode.UPDATE);  
        fileStream.writeBytes(ba); 
        fileStream.addEventListener(Event.CLOSE, fileClosed);  
        fileStream.addEventListener(Event.COMPLETE, fileComplete);  
        fileStream.addEventListener(IOErrorEvent.IO_ERROR, fileError); 
        fileStream.close();


        function fileClosed(event:Event):void {  
            outputText.text = "close";
        }

        function fileComplete(event:Event):void {  
            outputText.text = "complete";
        } 
        function fileError(event:IOErrorEvent):void {  
            outputText.text = "error"; 
        }   

Ответы [ 4 ]

3 голосов
/ 08 августа 2011

Безопасность AIR запрещает запись в каталог приложения.
Если вам абсолютно необходимо записать какой-либо файл в каталог приложения, вы можете использовать для этого встроенный помощник (например, cmd.exe в Windows). Но вместо этого рассмотрите возможность использования File.applicationStorageDirectory - он доступен для записи, но скрыт где-то в профиле пользователя.

2 голосов
/ 08 августа 2011

flash.fileSystem.File.applicationDirectory только для чтения. здесь будут отображаться ресурсы, которые вы связали с приложением AIR.

для доступа для чтения и записи, специфичного для вашего приложения, используйте flash.fileSystem.File.applicationStorageDirectory . у вас также есть доступ к другим специфическим для ОС каталогам для чтения и записи через статические свойства File .

этот поток SO перечисляет конкретные местоположения приложения StoreDirectory для Windows, Mac и Linux: Разница в расположении файла хранения в эфире

1 голос
/ 17 мая 2014

есть способ написать в директорию приложения вот хак.

var bmo:BitmapData = new BitmapData(150, 150, false, 0xFF0000); 
var bm:Bitmap = new Bitmap(bmo); 
addChild(bm);

var e:JPGEncoder = new JPGEncoder(100);
var ba:ByteArray = e.encode(bmo);

var f:File = new File(File.applicationDirectory.nativePath);
f= f.resolvePath("test.jpg");

var s:FileStream = new FileStream();  
s.open(f, FileMode.UPDATE);  
s.writeBytes(ba);
s.close();
0 голосов
/ 08 августа 2011

Поскольку вы используете обычный метод open(), вы открываете файл в синхронном режиме, что означает, что следующая строка (или, скорее, оператор) в вашем коде не будет выполнена, пока предыдущая не завершится.Это означает, что ваши прослушиватели событий даже не добавляются до тех пор, пока не завершится writeBytes ().

Попробуйте просто изменить порядок строк кода следующим образом:

var fileStream:FileStream = new FileStream();
fileStream.addEventListener(Event.CLOSE, fileClosed);  
fileStream.addEventListener(Event.COMPLETE, fileComplete);  
fileStream.addEventListener(IOErrorEvent.IO_ERROR, fileError); 
fileStream.open(newImage, FileMode.UPDATE);
fileStream.writeBytes(ba); 
fileStream.close();

Это будет гарантировать, чтоСлушатели событий были добавлены до того, как метод writeBytes () был выполнен (и завершен), поэтому ваши обработчики событий будут вызваны.

Однако, подумайте, нужен ли вам вообще прослушиватель событий.Прослушиватели событий (и шаблон «Наблюдатель», на котором они построены) - это, как правило, решение необходимости ждать завершения асинхронной операции.Поскольку вы просто используете синхронную запись, вы, вероятно, даже не нуждаетесь в них.

...