zoukankan      html  css  js  c++  java
  • 【WP 8.1开发】解决调用真实摄像头会死机的问题

    无论你是用Silverlight还是用RT的API来开发,在使用MediaCapture拍照片或录视频时,要是在模拟器上运行会万事大吉;但是,一旦放到真实手机上运行,肯定有人发现了,细心的朋友肯定发现了——不知道为什么,会经常导致手机重启,或者死机。

    啊,顺便给大家说说,死机不可怕,也不用重置,也不用刷机,不会丢失资料的,你只要同时按下“音量减”+“电源”两个键,要同时按住,不要放开,大约等10多秒后,会关机,然后你再放开这两个键,这样手机就软启了,不会丢失数据。

    不过,如果你的运营商(如中国联通)的基站没有实时更新时间的功能,那么,手机在软启后时间会不准,你可以手动调整一下。有些人说:不是设置了自动更新时间吗?怎么会不准了呢?注意WP上的自动更新时间不是用网络连接来更新的,而是通过移动运营商的基站来更新的,我的中国移动卡会得到基站的数据,但时间不准,会慢了半个小时。

    好了,上面说的废话太多,我担心有人会扔砖头。我们当Coder的一定要有耐心做事的好习惯,不然你真的不是好Coder,不要一遇到问题就在那里骂外公骂娘的,也不要在那里踢桌子砸凳子,因为你没有那样的功力,桌子没踢坏你的脚就会痛得不行。

    调用摄像头API导致死机的原因是:应用程序占用了系统的资源,也就是说你的应用没有及时释放相关资源导致的,一般这种情况多发生在调试的时候,因为我们通常在调试时会直接在VS上结束应用程序,如此一来,清理资源的代码就没有执行,系统资源仍然被你占着,所以一旦再次执行应用程序,或者运行其他相机应用,就会导致系统在无限等待,于是就死机了。

    要释放MediaCapture对象其实很简单,只要调用它的Dispose方法即可,关键是,要在哪里调用。

    为了安全保险,应该中导航离开页面时释放(处理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不会发生。

    例如:

    当运行应用程序后,我突然按了一个“开始”键,这时候会回到开始屏幕。此时,导航离开页面会发生,应用程序的DeActived事件会发生,但是,应用程序的关闭事件不会发生。

    总之,在这三件事发生时都清理一次,可保万全。

    A、在导航离开页面时,清理。

            protected override void OnNavigatingFrom ( NavigatingCancelEventArgs e )
            {
               ……
                (App.Current as App).ClearupCapture();
            }


    B、应用被发送到后台时,清理。

            private void Application_Deactivated ( object sender, DeactivatedEventArgs e )
            {
                ClearupCapture();
            }

    即响应Deactivated事件。

    C、当应用关闭时,清理。

            private void Application_Closing ( object sender, ClosingEventArgs e )
            {
                ClearupCapture();
            }

    即处理Closing事件。

    用Runtime API调用摄像头时要谨慎,尤其是在调试的时候,最好,先在手机上先把应用关闭,再从VS上结束应用程序

    不是骗你,经过我近一个星期N多次的测试,这样做确实不会死机,在测试过程中,我那台可怜的Lumia 920不知道死了多少次。记住,有借有还,再借不难。占用系统资源一定要释放

    下面,顺便附上我写的一个测试示例,如果大家不嫌我这个示例太垃圾的话,可以下来玩玩。

     http://files.cnblogs.com/tcjiaan/AppCamera.zip

    我比较头痛的另一件事是:不同手机的硬件差异,摄像头的角度经常会偏了,920的摄像头是旋转了90度,这个问题说好办也好办,说不好办也挺难办,因为目前移植的RT库中,貌似不能旋转。

  • 相关阅读:
    VS2013中使用本地IIS+域名调试ASP.NET项目
    layui框架中layer父子页面交互的方法分析
    Layer组件多个iframe弹出层打开与关闭及参数传递
    Android新版本特性以及注意事项
    【Android Studio安装部署系列】三十、从Android studio2.2.2升级到Android studio3.0之路
    【Android Studio安装部署系列】二十八、Android Studio查看其它APP的布局结构
    【Android Studio安装部署系列】二十七、Android studio修改项目名称和包名
    Beetle简单构建TCP服务
    【Android Studio安装部署系列】十三、Android studio添加和删除Module 2
    LeetCode242——Valid Anagram
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/3940043.html
Copyright © 2011-2022 走看看