Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件
第21部分:永久保存Wav音頻文件
原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-21-Permanently-Saving-the-Audio-Wav-File
系列地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners
源代碼:?http://aka.ms/absbeginnerdevwp8
PDF版本: http://aka.ms/absbeginnerdevwp8pdf
現(xiàn)在我們可以錄制聲音并將它保存到應(yīng)用程序獨立存儲的臨時文件中。接下來我們需要提示用戶輸入新的自定義聲音的顯示名稱來允許用戶永久保存聲音。
本課的計劃:
1. 向"save"按鈕添加事件處理程序方法并管理應(yīng)用欄的狀態(tài)
前面我們通過啟用BuildLocalizedApplicationBar()為RecordAudio.xaml頁面創(chuàng)建了應(yīng)用欄。所以我們需要做的就是激活它:
接著,我們將在用戶停止錄制后啟用應(yīng)用欄。在RecordAudioUnchecked()方法中,我們將IsVisible屬性設(shè)置為true(見以下67行):
2. 使用Coding4Fun工具包顯示輸入對話框以獲取新的自定義聲音音頻文件名稱
在上面的步驟中我們?yōu)镾aveRecordingClick()方法添加了一個方法存根
我將替換拋出異常作為提醒的那行代碼并編寫以下代碼(見51行):
因為InputPrompt(輸入提示)來自與我們目前使用的其它類不同的命名空間,我們需要添加一個using語句(使用懸停于藍色虛線的方法以顯示一個上下文菜單)。
接著我們將配置并顯示InputPrompt:
當用戶為新的自定義聲音輸入名稱并單擊勾選按鈕時,FileNameCompleted()事件處理程序?qū)⒈挥|發(fā)。
我們將通過檢查結(jié)果確保用戶正確退出InputPrompt。我們將檢查作為輸入?yún)?shù)發(fā)送給事件處理程序方法的PopUpResult。如果結(jié)果是"OK",則我們就可以執(zhí)行必要的邏輯來將臨時文件保存為新的"永久的"聲音。請查看我添加的代碼以及代碼的注釋,這些注釋提供了一個我希望執(zhí)行的"后續(xù)步驟"的一個大綱:
在注釋1和2之間是一個需要做些什么以便正常工作的概述。在我們嘗試實施這些想法前,讓我們通過運行應(yīng)用程序來確保到目前為止流程的運作與我們的期望相一致。
我使用切換按鈕錄制自定義聲音。當我停止錄制時,我將會看到應(yīng)用欄的出現(xiàn):
當我單擊磁盤圖標保存自定義聲音時,將顯示輸入對話框:
并且當我輸入聲音名稱并單擊勾選圖標時,對話框?qū)⑾Р盐規(guī)Щ豈ainPage.xaml。很好!
現(xiàn)在讓我們處理困難的部分,執(zhí)行代碼注釋中列出的任務(wù)。
3.將聲音文件保存到永久的獨立存儲區(qū)域,將CustomSounds數(shù)據(jù)序列化到JSON文件
至此我們錄制了自定義聲音并將它作為臨時文件存儲,并且我們剛剛為聲音收集了一個友好的顯示名稱。我們需要完成兩項基本的任務(wù):
所以我向FileNameCompleted()方法添加了以下代碼:
然而,當我們關(guān)閉應(yīng)用程序并且它被完全從手機內(nèi)存中刪除,將會發(fā)生什么?屆時CustomSounds.Items集合將從內(nèi)存中刪除,并且下一次應(yīng)用程序運行時,應(yīng)用程序?qū)o法獲得我們的自定義聲音。我們需要一種方法存儲自定義的聲音數(shù)據(jù),這樣我們就可以在下次用戶運行應(yīng)用程序時將其加載到我們的數(shù)據(jù)模型中。
4.將CustomSounds聲音組序列化到JSON,并從JSON反序列化到CustomSounds聲音組
為此我們需要將CustomSounds.Items集合序列化到一種數(shù)據(jù)格式。有許多數(shù)據(jù)格式可供選擇,但是我們將選擇一種非常流行,輕量級并易于使用的格式——JSON。它是JavaScript Object Notion(JavaScript對象表示法)的縮寫。它使我們方便地用JavaScript對象表示集合。如果我們利用名為Json.NET的第三方開源庫,我們甚至不用考慮數(shù)據(jù)的格式,大部分復雜性將被簡單的方法調(diào)用隱藏。
首先,我們將打開NuGet程序包管理器(使用我在前面演示過的技術(shù),右鍵單擊引用文件夾并選擇管理NuGet程序包選項)。
為驗證Json.NET是否安裝成功,打開SoundBoard項目的引用文件夾并驗證Newtonsoft.Json將出現(xiàn)在那里:
回到FileNameCompleted()方法,下一步是將CustomSounds.Items轉(zhuǎn)換為Json,讓后將它存儲到磁盤。
我們將使用Newtonsoft.Json.JsonConvert類執(zhí)行轉(zhuǎn)換。您需要添加適當?shù)膗sing語句以使用JsonConvert類:
現(xiàn)在我們準備實現(xiàn)CustomSounds Json文件到磁盤的存儲。
在忘記之前,讓我們在SoundModel.cs文件中定義CustomSoundKey,我將添加以下代碼行(見19行):
如您所見,這是一個常量字符串值。我們希望它是常數(shù),因為它不會改變。它只是在獨立存儲中找回正確的應(yīng)用設(shè)置(ApplicationSetting)的一個唯一的字符串。
接著,我們將在實例化所有其它SoundGroup對象的同時加載自定義聲音到內(nèi)存中,在SoundModel.cs文件的LoadData()方法中:
在上述28行,我們將調(diào)用一個輔助方法LoadCustomSounds()以填充SoundModel類的CustomSounds屬性。使用我在之前演示過的技術(shù)為新的方法生成一個存根。
在LoadCustomSounds()方法中,我們將嘗試從IsolatedStorageSettings中檢索包含序列化自定義聲音的Json:
現(xiàn)在讓我們動手測試應(yīng)用程序。我將錄制一個聲音并嘗試用名稱"another test"保存該聲音。
一切看起來都很好,但是當我保存新的自定義聲音后返回MainPage.xaml并嘗試播放它時會發(fā)現(xiàn),它無法播放!這是因為我們需要修改MainPage.xaml上的播放代碼以從新的文件夾加載自定義聲音。目前它僅從/Assets文件夾加載。
我們的目標是將MediaElement的Source屬性設(shè)置為正確的聲音文件的位置,這些聲音文件與用戶點擊的磁貼相關(guān)。我們將在兩個位置查找,或者是/Assets文件夾,或者是獨立存儲區(qū)域。
在MainPage.xaml.cs文件的LongListSelector事件處理程序方法中,我將添加以下內(nèi)容:
這里我嘗試查看用戶選擇的磁貼是否是自定義聲音。如果我們不能在Assets\文件夾定位與磁貼相關(guān)的文件,那么將在應(yīng)用程序獨立存儲區(qū)域中的/customSounds/子文件夾中查找。
對于上述檢查,我們需要訪問手機的文件系統(tǒng),所以我們將使用System.IO.File對象。以上截圖顯示了如何在代碼文件頂部添加合適的using語句以包含System.IO。
此外,我們希望包含System.IO.IsolatedStorage引用,因為接下來我們將使用該命名空間中的類。
回到LongListSelector的SelectionChanged()事件處理程序方法,如果SoundData對象的FilePath所指的文件不能在缺省位置被找到,則File.Exists()將返回false。否則,它將位于/Assets文件夾。所以基于以上分析我編寫了以下代碼:
這次我們運行應(yīng)用程序,錄制并保存聲音,然后返回“我的”自定義聲音類別,每一個保存的聲音應(yīng)該都可以正確播放了!
回顧
綜上所述,本課的重點是使用Newtonsoft Json序列化和反序列化對象到JSON,它是一個提升手機開發(fā)的非常有價值的技能。我們還學習了如何處理IsolatedStorage,特別是用IsolatedStorageSettings來存儲名稱/值對。我們使用System.IO.File類來檢查文件系統(tǒng),并學習了如何處理流。我們還使用了Coding4Fun工具包中的InputPrompt等內(nèi)容。我們已經(jīng)基本完成了應(yīng)用程序,我們將進行最后的加工以使它更有趣。
轉(zhuǎn)載于:https://www.cnblogs.com/zigzagPath/p/3481070.html
總結(jié)
以上是生活随笔為你收集整理的Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 升级 Impala(翻译)
- 下一篇: 【转】C# 二维码生成