我使用 Jason Sturges 提供的 DevGirl XpenseIt 解决方案取得了很大的成功,以响应其他几个对此方面的帮助请求:(http://stackoverflow.com/questions/11812807/take-photo -using-adobe-builder-flex-for-ios 是最好的例子)
非常成功,除了在使用 CameraUI 和教程中的 util 类拍照后在 iOS6 中按下“使用”按钮之间,总共需要 47 个 1-hippopotamus、2 个 hippapotamusses 直到“fileReady”事件发生。
在我看来,Loader 类似乎不应该那么长。
我可以做些什么来提高这个性能吗?我被迫添加一个“快点等待”的 UI 元素,这样我的用户就不会认为程序已挂起。这是上面的 CameraUtil.as 代码,因为我当前正在使用它。
// http://stackoverflow.com/questions/11812807/take-photo-using-adobe-builder-flex-for-ios
package classes
{
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.events.MediaEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.media.CameraRoll;
import flash.media.CameraUI;
import flash.media.MediaPromise;
import flash.media.MediaType;
import flash.utils.ByteArray;
import mx.graphics.codec.JPEGEncoder;
import events.CameraEvent;
[Event(name = "fileReady", type = "events.CameraEvent")]
public class CameraUtil extends EventDispatcher
{
protected var camera:CameraUI;
protected var loader:Loader;
public var file:File;
public function CameraUtil(target:IEventDispatcher=null)
{
super(target);
if (CameraUI.isSupported)
{
camera = new CameraUI();
camera.addEventListener(MediaEvent.COMPLETE, mediaEventComplete);
}
} // End CONSTRUCTOR CameraUtil
public function takePicture():void
{
if (camera)
camera.launch(MediaType.IMAGE);
} // End FUNCTION takePicture
protected function mediaEventComplete(event:MediaEvent):void
{
var mediaPromise:MediaPromise = event.data;
if (mediaPromise.file == null)
{
// For iOS we need to load with a Loader first
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleted);
loader.loadFilePromise(mediaPromise);
return;
}
else
{
// Android we can just dispatch the event that it's complete
file = new File(mediaPromise.file.url);
dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file));
}
} // End FUNCTION mediaEventComplete
protected function loaderCompleted(event:Event):void
{
var loaderInfo:LoaderInfo = event.target as LoaderInfo;
if (CameraRoll.supportsAddBitmapData)
{
var bitmapData:BitmapData = new BitmapData(loaderInfo.width, loaderInfo.height);
bitmapData.draw(loaderInfo.loader);
file = File.applicationStorageDirectory.resolvePath("receipt" + new Date().time + ".jpg");
var stream:FileStream = new FileStream()
stream.open(file, FileMode.WRITE);
var j:JPEGEncoder = new JPEGEncoder();
var bytes:ByteArray = j.encode(bitmapData);
stream.writeBytes(bytes, 0, bytes.bytesAvailable);
stream.close();
dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file));
}
} // End FUNCTION loaderComplete
} // End CLASS CameraUtil
} // End PACKAGE classes
最佳答案
我能够通过从流程中删除一个步骤来解决延迟问题。这一步是我本人(目前)不需要的,但其他人可能需要,因此删除它并不能真正回答“为什么这个看似合理的过程花费了看似不合理的时间”的问题。
我需要 BitmapData,而不是外部文件,因此:
相机 => [snap] => 媒体 promise => 加载器 => 写入文件 => 事件 => 读取文件 => 使用 BitmapData
我重写了该类以删除 File/AppStorage i/o。
相机 => [snap] => Media Promise => Loader => 使用 BitmapData
所以这是一个非常合理的(和预期的补偿时间)。
但是,我仍然感到惊讶的是,使用 CameraUtil 类中使用的方法将数据写入文件需要花费如此长的时间。我确实需要将这些图像写入文件,但直到用户将尺寸缩小到 1024x768 裁剪区域并将它们编码为非常压缩的 jpg 时,所以希望我只需要处理挂起的一小部分/补偿时间。
有人知道...从 Adobe AIR(通过 Flex)将 1 个文件写入 iOS 中的应用程序存储是否需要花费很长时间?
关于ios - 为什么在 iPad 2/iOS 6 上从相机到 AIR 会出现长时间延迟(47 秒) - 相机 UI、Loader、MediaEvent、Media Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13728197/