如何使用AIR将映像写入应用程序目录



我试图通过打开文件流并从位图数据写入字节来保存图像到应用程序目录。我添加了一些事件监听器来测试文件流进程,但我没有收到任何响应事件。你能检查一下我的代码并告诉我哪里可能有问题吗?

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

AIR安全禁止写入应用程序目录。
如果你绝对需要将一些文件写入应用程序目录,你可以使用本地助手来做这件事(例如Windows上的cmd.exe)。但是考虑使用File。applicationStorageDirectory——它是可写的,但隐藏在用户配置文件的某个地方。

flash. filessystem .file。applicationDirectory是只读的。这是你绑定到AIR应用程序的资源显示的地方。

对于特定于你的应用程序的读写访问,使用flash. filessystem .file . applicationstoragedirectory代替。您还可以通过File的静态属性访问其他操作系统特定的读写目录。

这个SO线程列出了Windows, Mac和Linux的applicationStorageDirectory的具体位置:位置存储文件在空气中的差异

有一种方法可以写入applicationDirectory。

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

因为您使用的是常规的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()方法执行(和完成)之前已经添加了事件侦听器,以便调用事件处理程序。

但是,请考虑是否真的需要事件侦听器。事件侦听器(以及构建它们的"观察者"模式)通常是必须等待异步操作完成的解决方案。由于您只是使用同步写入,您可能甚至不需要它们

相关内容

  • 没有找到相关文章

最新更新