無論你是用Silverlight還是用RT的API來開發,在使用MediaCapture拍照片或錄視頻時,要是在模擬器上運行會萬事大吉;但是,一旦放到真實手機上運行,肯定有人發現了,細心的朋友肯定發現了——不知道為什麼,會經常導致手機重啟,或者死機。
啊,順便給大家說說,死機不可怕,也不用重設,也不用刷機,不會丟失資料的,你只要同步選取“音量減”+“電源”兩個鍵,要同時按住,不要放開,大約等10多秒後,會關機,然後你再放開這兩個鍵,這樣手機就軟啟了,不會遺失資料。
不過,如果你的電訊廠商(如中國聯通)的基站沒有即時更新時間的功能,那麼,手機在軟啟後時間會不準,你可以手動調整一下。有些人說:不是設定了自動更新時間嗎?怎麼會不準了呢?注意WP上的自動更新時間不是用網路連接來更新的,而是通過行動電信業者的基站來更新的,我的中國移動卡會得到基站的資料,但時間不準,會慢了半個小時。
好了,上面說的廢話太多,我擔心有人會扔磚頭。我們當Coder的一定要有耐心做事的好習慣,不然你真的不是好Coder,不要一遇到問題就在那裡罵外公罵娘的,也不要在那裡踢桌子砸凳子,因為你沒有那樣的功力,桌子沒踢壞你的腳就會痛得不行。
調用網路攝影機API導致死機的原因是:應用程式佔用了系統的資源,也就是說你的應用沒有及時釋放相關資源導致的,一般這種情況多發生在調試的時候,因為我們通常在調試時會直接在VS上結束應用程式,如此一來,清理資源的代碼就沒有執行,系統資源仍然被你佔著,所以一旦再次執行應用程式,或者運行其他相機應用,就會導致系統在無限等待,於是就死機了。
要釋放MediaCapture對象其實很簡單,只要調用它的Dispose方法即可,關鍵是,要在哪裡調用。
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/
為了安全保險,應該中導航離開頁面時釋放(處理OnNavigatingFrom方法),或者在應用程式不在前台運行時釋放,當再次回到應用程式時,重新執行個體化MediaCapture對象。這樣做的好處既能及時釋放資源,而且在你的應用程式發送到後台後,你不能保證其他程式不會調用網路攝影機,不然,資源老被你佔著,別人沒法用了。
以Silverlight架構為例,可以在App類中定義一些成員來初始化和清理MediaCapture。
public sealed partial class App { MediaCapture capture = null; /// <summary> /// 通過該屬性獲得MediaCapture執行個體 /// </summary> internal MediaCapture PhotoCaptureForCurrent { get { return capture; } } /// <summary> /// 初始化 /// </summary> internal async Task InitailizeCapture () { var devs = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture); DeviceInformation bc = devs.FirstOrDefault(d => d.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back); if (bc != null) { MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings(); settings.AudioDeviceId = ""; settings.VideoDeviceId = bc.Id; capture = new MediaCapture(); await capture.InitializeAsync(settings); } } /// <summary> /// 清理 /// </summary> internal void ClearupCapture () { if (capture != null) { capture.Dispose(); capture = null; } } }
在調用Dispose方法後,把MediaCapture變數設定為null引用,這樣就算清理方法被多次調用也不會出錯。
為了安全保險,清理方法有可能被重複調用。因為我會考慮在頁面離開時調用一次,在應用程式被放入後台時調用一次,在應用程式關閉時調用一次。
有人會問,為什麼要這樣?因為1、離開頁面;2、應用被停用(不在前台);3、應用關閉。
這三件事你無法保證它都發生,有時候,可能1發生,但2和3不會發生。