无论你是用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库中,貌似不能旋转。

【WP 8.1开发】解决调用真实摄像头会死机的问题的更多相关文章

  1. php-fpm死机解决办法,脚本后台自动重启

    本人用nginx+php7搭建了一台服务器,因为请求量太大,而且php里面又有挂起的任务,导致php-fpm在高峰期的时候经常死掉,吧php-fpm的最大进程数已经改到1000了,还是吃不消,cpu也 ...

  2. 【WP 8.1开发】如何处理摄像头翻转的问题

    模拟器就像我们儿时的梦境,在其上运行应用程序时,一切总是那么美好的:而真机测试如同我们这个纷乱无章的现实世界,你会遇到各种小人和畜生,常常会遭受莫名的挫折.面对挫折,有人迎难而上,或不予理采,走自己的 ...

  3. H5混合开发二维码扫描以及调用本地摄像头

    今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底 ...

  4. 树莓派3中没有/dev/video0的解决方法(使用OpenCV编程调用树莓派摄像头的方法)

    一.问题 使用下列方法调用OpenCV编程调用树莓派摄像头时总是失败,提示调用Grabber的start()时失败. import org.bytedeco.javacpp.opencv_core; ...

  5. 安卓开发解决android.os.NetworkOnMainThreadException异常方法(主线程不能直接调用webservice)

    安卓开发解决android.os.NetworkOnMainThreadException异常方法 2013-01-07 14:01:04|  分类: 技术 |  标签:安卓  技术  java  | ...

  6. 【WP 8.1开发】How to 图像处理

    在今天的吹牛节目开始之前,先交代一件事: 关于玩WP 8.1开发所使用的VS版本问题.对版本的要求是2013的Update2,这是最低要求,只要是这个版本或以上都可以,而update3,update4 ...

  7. Android 开发笔记“调用.net webservice遇到的问题”

    1.An exception occurred: org.ksoap2.SoapFault SoapFault - faultcode: 'soap:Server' faultstring: '服务器 ...

  8. QuickWebApi:使用Lambada方式,完成对WebApi的开发和调用。

    QuickWebApi 目的:使用Lambada方式,完成对WebApi的开发和调用. 缘由:为了解耦服务和展现,将越来越多的使用WebApi提供各种服务:随着服务的细化,WebApi的接口将越来越多 ...

  9. C# Activex调用USB摄像头--附带源码

    前言 最近在整理一些自己写过的东西,也算是重新熟悉一下并且优化一下吧. 需求:获取本地USB摄像头视频显示,并且获取图片数据给底层做人脸识别. 记得当时直接采用H5已经做好了,调试好了....结果放上 ...

随机推荐

  1. coalesce函数用法

    COALESCE函数会依次检查输入的参数,返回第一个不是NULL的参数,只有当传入COALESCE函数的所有的参数都是NULL的时候,函数才会返回NULL

  2. JavaWeb开发学习(一)-JavaWeb开发概述

    1.Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器以及网络组成.Web程序的好处是使用简单,不需要安装.学习,有一台电脑.一根网线就可以使用.Web程序不是一般意义上的网站.网 ...

  3. (原创)巩固理解基于DS18B20的1-wire协议(MCU,经验)

    1.Abstract     如前篇随笔所写,将以前遇到最难懂的两个部分重拾一下.前一篇写的是I2C协议(http://www.cnblogs.com/hechengfei/p/4117840.htm ...

  4. jquery ajax post 中文乱码解决

    jquery ajax post 方式默认传递的是UFT-8字符,即使页面设置了gbk编码也无效.字符传到后台时如果后台设置的gbk或者其他编码,就会出现乱码.解决很容易,将后台页面设置成UTF-8编 ...

  5. svn忽略eclipse自动生成的文件

    工程目录下右键,选择“TortoiseSVN”——“Settings”菜单 选择“General”,在“Global ignore pattern”输入框的最前面添加 .settings .class ...

  6. Android 自定义View 三板斧之三——重写View来实现全新控件

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文来讨论最难的一种 ...

  7. 高性能网站架构设计之缓存篇(5)- Redis 集群(上)

    集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节 ...

  8. Xamarin 跨移动端开发系列(01) -- 搭建环境、编译、调试、部署、运行

    如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!好了,废话不多说,就开始吧, ...

  9. dojo/aspect源码解析

    dojo/aspect模块是dojo框架中对于AOP的实现.关于AOP的详细解释请读者另行查看其它资料,这里简单复习一下AOP中的基本概念: 切面(Aspect):其实就是共有功能的实现.如日志切面. ...

  10. Spring AOP简述

    使用面想对象(Object-Oriented Programming,OOP)包含一些弊端,当需要为多个不具有继承关系的对象引入公共行为时,例如日志,安全检测等.我们只有在每个对象中引入公共行为,这样 ...