2015-07-28 53 views
0

加載ByteArray在移動應用程序中時,我需要發送用戶使用相機或從相機中選取的圖像。 我使用的八哥框架和feathersUI(雖然我認爲這並不重要的問題)時的MediaPromise使用loadFilePromise我用下面的代碼來處理圖像數據加載 :安全錯誤當試圖從mediaPromise

_mediaLoader = new Loader() 
//loading the filePromise from CameraRoll 
_mediaLoader.loadFilePromise(_mediaPromise); 
_mediaLoader.contentLoaderInfo.addEventListener(starling.events.Event.COMPLETE, onLoadImageComplete); 
private function onLoadImageComplete(event:flash.events.Event=null):void { 
    //creating the starling texture to display the image inside the application 
    var texture:Texture = Texture.fromBitmapData(Bitmap(_mediaLoader.content).bitmapData, false, false, 1); 
    //now trying to load the content into a bytearray to send to the server later 
    var bytes:ByteArray=_mediaLoader.contentLoaderInfo.bytes; 
} 

最後一行的代碼導致安全錯誤: 錯誤#2044:未處理的SecurityErrorEvent :. text =錯誤#2121:安全沙箱衝突:應用程序:/myapp.swf:http://adobe.com/apollo/[[DYNAMIC]]/1無法訪問。這可以通過調用Security.allowDomain解決。

我試圖

Security.allowDomain("*") 

作爲測試 但後來我得到: 的SecurityError:錯誤#3207:應用程序沙箱內容無法訪問此功能。

作爲一種變通方法我寫在裝載機的應用裏面我自己PNG ByteArray將BitmapData使用Adobe的包括PNGEncoder類:

var ba:ByteArray=PNGEncoder.encode(Bitmap(_mediaLoader.content).bitmapData) 

但是這需要時間顯著量...

我也嘗試過用於FileReference加載圖像但

_mediaPromise.file 

_mediaPromise.relativePath 

都爲空。

我在做什麼錯?或者這是一個已知的問題?

謝謝!

+0

因爲我沒有真正的answere這個呢,我可以告訴你,我解決了這個問題,在我的最後一個項目,通過使用com.freshplanet.ane.AirImagePicker那裏返回的數據類型的BitmapData的。所以如果你堅持使用你的代碼並且沒有出路,那麼看看這個ANE,它對我很有用。您目前是否在手動請求本地相機應用程序,或者您目前正在使用哪條路線? –

+0

獲取的BitmapData是使用位圖(_mediaLoader.content).bitmapData 獲取原始的ByteArray是問題沒有問題... ... – zantafio

+0

你試過從接收的BitmapData的ByteArray的getPixels用? (請參閱[這是線程](http://stackoverflow.com/questions/27444583/get-a-bytearray-from-bitmapdata-in-as3)) –

回答

0

你好,我發現基於關於這裏提到的EXIF數據的後處理解決方案:http://blogs.adobe.com/cantrell/archives/2011/10/parsing-exif-data-from-images-on-mobile-devices.html

關鍵代碼

private function handleMedia(event:MediaEvent):void{ 

    _mediaPromise=event.data as MediaPromise; 
    _imageBytes=new ByteArray() 
    var mediaDispatcher:IEventDispatcher = _mediaPromise.open() as IEventDispatcher; 
    mediaDispatcher.addEventListener(ProgressEvent.PROGRESS, onMediaPromiseProgress); 
    mediaDispatcher.addEventListener(flash.events.Event.COMPLETE, onMediaPromiseComplete); 
}; 
private function onMediaPromiseProgress(e:ProgressEvent):void{ 
    var input:IDataInput = e.target as IDataInput; 
    input.readBytes(_imageBytes, _imageBytes.length, input.bytesAvailable); 
}; 
private function onMediaPromiseComplete(e:flash.events.Event):void{ 
    _mediaLoader = new Loader(); 
    _mediaLoader.loadBytes(_imageBytes) 

}; 

作品像iPad和iPhone爲我的魅力。