Windows phone 8.1開發中解決調用真實網路攝影機會死機的問題

來源:互聯網
上載者:User

無論你是用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不會發生。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.