2016-04-08 70 views
1

我終於嘗試將我的Flash遊戲移植到應用程序,從iOS開始。我被困在圖像保存功能上。在瑞士法郎的,我用jpegencoder保存到桌面服務器。似乎有一些研究表明,該代碼仍然可以在移動設備上工作,所以我嘗試了它,但是在從Adobe AIR進行iPhone測試時似乎沒有做任何事情(該按鈕註冊了一個點擊,但沒有可以成爲圖像的圖像)發現,沒有發生任何事情的通知,不要求訪問圖像的權限等)。這是舊代碼:使用Adobe AIR在iOS上保存位圖

saveToDisc.addEventListener(MouseEvent.CLICK, saveToDiscSave); 
function saveToDiscSave(e:MouseEvent):void { 
    this.visible = false; //hides menu 

    var bitmapData:BitmapData = new BitmapData(1242,1864); 
    bitmapData.draw(MovieClip(root)); 
    var jpgEncoder:JPGEncoder = new JPGEncoder(80); 
    var byteArray:ByteArray = jpgEncoder.encode(bitmapData); 
    var fileReference:FileReference=new FileReference(); 
    fileReference.save(byteArray, "Dinogeddon-DollDivine.jpg"); 

    //this.visible = true; //returns menu. commented out to see if click registered 
} 

所以有更多的研究,我發現這看起來簡單,像它專門了iOS版的CameraRoll代碼。所以我嘗試過,但我遇到了同樣的問題:沒有證據表明發生了任何事情。沒有保存圖像,沒有錯誤,沒有權限請求。

saveToDisc.addEventListener(MouseEvent.CLICK, saveToDiscSave); 
function saveToDiscSave(e:MouseEvent):void { 
    this.visible = false; 

    var cameraRoll:CameraRoll = new CameraRoll(); 
    var bitmapData:BitmapData = new BitmapData(1242,1864); 
    bitmapData.draw(MovieClip(root)); 
    cameraRoll.addBitmapData(bitmapData); 

    //this.visible = true; 
} 

喜歡,我什至不知道我要去哪裏錯了..應用程序是否處於測試模式,甚至能夠保存圖像?我是否應該期待某種通知彈出?是否有保存到手機的東西的大小限制? HALP

+0

你想在相機膠捲中的圖像?或者只是存儲在設備上的某個地方,以後可以再次檢索它? FileReference我不認爲適用於移動設備,您必須使用FileStream和File類保存到應用程序存儲目錄。你確定'CameraRoll.supportsAddBitmapData'是真的嗎? – BadFeelingAboutThis

+0

此外,您應該聽取錯誤,因爲相機膠捲addBitmapData方法是異步操作。 'cameraRoll.addEventListener(ErrorEvent.ERROR,handleMyError);',你也可以監聽Event.COMPLETE事件。 – BadFeelingAboutThis

+0

應用程序不需要圖像。這僅僅是爲了用戶自己的細讀。我不在乎它是否是專門的相機膠捲。我只是希望它在任何習慣這種事情的地方都能保存下來? –

回答

1

所以...相機膠捲代碼確實有效,就像我擁有它一樣。 它確實是一個非常好的和乾淨的方式來做到這一點。 我想我遇到了測試問題,只是無法說明它正在工作。

當正常工作時,它會在設備上請求一次權限,之後它會保存而不會通知,因此我添加了一些動畫以隱藏「保存」按鈕幾秒鐘,以便用戶不會自己濫用垃圾郵件,並且給出一個按鈕被按下的視覺提示。

1

移動應用程序的行爲與桌面應用程序非常相似,但您的代碼無論如何都不適用。例如,您甚至不想使用專門爲桌面和移動設備製作的類,如File類。無論如何,在我向您展示您需要忘記爲網絡執行swf(這是您的代碼顯示的內容)的步驟之前,您需要移動/桌面應用程序,然後調整您的想法並使用AIR類。

首先,通過提交的ByteArray獲取數據:

var byteArray:ByteArray = new ByteArray(); 
bitmapData.encode(new Rectangle(0,0,bitmapData.width,bitmapData.height), new PNGEncoderOptions(), byteArray); 

其次,選擇一個目的地(在移動它通常是File.applicationStorageDirectory)和是使用AIR類文件。

var dest:File = File.applicationStorageDirectory.resolvePath("mypng.png"); 

第三,你得到的數據,你有目標,現在使用AIR類FileStream節省:

var stream:FileStream = new FileStream(); 
stream.open(dest, FileMode.WRITE); 
stream.writeBytes(byteArray); 
stream.close(); 

而且僅此而已。使用File類在存儲目錄中創建目錄和文件。小心,在移動設備上,您將不會被允許在任何地方保存文件,這就是爲什麼使用applicationStorageDirectory更好,因爲它始終可用並可供您使用沙盒。

+0

如果你在iOS上的應用程序存儲目錄中寫入位圖數據,我發現它很慢,我使用的ANE寫入速度太快 –

+0

唯一的使用Ios上的Adobe AIR進行緩慢操作正在繪製位圖數據,該位圖數據可能爲n * 100ms。 – BotMaster

+0

不這麼認爲,我試着保存從iphone5捕獲的全屏幕,並且與ANE保存位圖數據相比,它需要很多保存。 –