我想要做的就是讓用戶錄製他的聲音。錄音將存儲在本地存儲器中。用戶應該能夠播放錄音或用新的錄音進行替換。這就是我遇到麻煩的地方。替換Windows Phone 8.1中MediaElement中以前用於源的文件會拋出E_ACCSESSDENIED
情景A:還沒有錄音,這工作正常......當用戶按下錄音按鈕時,會採取這些步驟錄製音頻,然後將其設置爲媒體元素的來源。
// user starts recording by pressing a button
// create file with replace option
var audioStorageFile = await folder.CreateFileAsync(desiredName, CreationCollisionOption.ReplaceIfExists);
await mediaCapture.StartRecordToStorageFileAsync(audioEncodingProperties, audioStorageFile);
// user stops recording...
await mediaCapture.StopRecordAsync();
//...
audioStream = await audioStorageFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
MyMediaElement.SetSource(audioStream, audioStorageFile.ContentType);
我可以重複這個過程多次,因爲我想和舊的音頻文件總是替換爲新的。
方案B:當我瀏覽的網頁,所以我想將其加載到MediaElement的時候了(的OnNavigatedTo事件)這樣
var audioStorageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(desiredName);
audioStream = await audioStorageFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
MyMediaElement.SetSource(audioStream, audioStorageFile.ContentType);
記錄已經存在,所以用戶瀏覽頁面和文件已經加載到MediaElement。當用戶想要替換舊的錄音時,問題就開始了。這段代碼從方案A的代碼之前被稱爲:
MyMediaElement.Stop();
MyMediaElement.Source = null;
當它到達線
var audioStorageFile = await folder.CreateFileAsync(desiredName, CreationCollisionOption.ReplaceIfExists);
UnauthorizedAccessException被拋出:訪問被拒絕。 (來自HRESULT的異常:0x80070005(E_ACCESSDENIED))。 似乎很清楚,拋出異常的原因是我試圖替換的文件正在使用中。但我不明白爲什麼以及如何避免它?任何人都可以發現我做錯了什麼嗎?謝謝。
感謝您的回答。但是你的解決方案不適合我。當在使用語句中設置源時,MediaOpened事件不會觸發 - >似乎很合邏輯,因爲流在媒體打開之前被放置。取而代之的是'MediaFailed'事件被這個代碼觸發:'MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED:HRESULT - 0xC00D36C4'。看看這個[鏈接](http://stackoverflow.com/questions/19202386/windows-8-app-mediaelement-not-playing-wmv-files)。我認爲在這種情況下'MediaElement'應該負責關閉流。我試着在'MediaOpened'中自己這樣做,但沒有幫助 – stambikk 2014-11-07 08:49:22
有趣的是,在我用'SetSource'設置源並且觸發'MediaOpened'事件之後,MediaElement.Source屬性是'null',儘管音頻是加載到MediaElement(我可以播放它) – stambikk 2014-11-07 09:28:33
@stambikk我能夠播放文件就好了。不幸的是,我並不是在靠近開發計算機的地方將示例應用程序上傳到OneDrive。加上它是凌晨2點,我應該睡着:) – 2014-11-07 09:30:35