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