【WP开发】手电筒
或许很多人都想到,可以利用手机上摄像头的闪光灯做手电筒,当然,有利必有害,每次使用的时间不要过长,几分钟一般不会有什么问题,如果时间太长,难保会有损伤。
以往的方案是调用视频录制功能来开始录制视频,同时打开摄像灯,就能做出手电筒了。
其实啊,在8.1中,从RT库移植过来的MediaCapture类(位于Windows.Media.Capture命名空间)可以在不录制视频的时候打开摄像灯。
也就是说,不需要调用StartRecordToXXX方法来开始录制,而是直接把摄像灯打开就行了,这样既不用写文件也不用消耗内存。大概思路我给大家说说。
1、初始化MediaCapture组件,这一步肯定不能少的;
2、MediaCapture类有一个VideoDeviceController属性,可以返回VideoDeviceController实例;
3、返回的VideoDeviceController实例有一个TorchControl属性,可以返回一个TorchControl实例;
4、TorchControl类有个Enabled属性,设置为true时,摄像灯就打开了,不必等开始录制它就会打开,如果设置为false,摄像灯就会关闭。
聪明的你,一定明白了,对啊,就是这样。
有人会问了,不是FlashControl吗,不是Flash是闪光灯,就是拍照片的时候闪一下那个,Flash只能闪一下,而手电筒是要持续亮着的,因此不能用Flash。
好,有了原理,要实现就看动手了。
这里我将初始化MediaCapture,清理MediaCapture,打开/关闭摄像灯等操作都封装起来。
- internal static class CaptureOperator
- {
- #region 私有字段
- static MediaCapture m_capture = null;
- static bool m_istorchOpened = false;
- static bool m_iscaptureCreated = false;
- #endregion
- #region 属性
- /// <summary>
- /// 指示摄像是否已打开
- /// </summary>
- public static bool IsTorchOpened
- {
- get { return m_istorchOpened; }
- }
- /// <summary>
- /// 指示MediaCapture是否已初始化
- /// </summary>
- public static bool IsCaptureCreated
- {
- get { return m_iscaptureCreated; }
- }
- #endregion
- #region 方法
- /// <summary>
- /// 初始化捕捉对象
- /// </summary>
- public async static Task CreateCaptureAsync ()
- {
- // 找出后置摄像头,一般闪光灯在后置摄像头上
- DeviceInformation backCapture = (from d in await GetCaptureDeviceseAsync() where d.EnclosureLocation.Panel == Panel.Back select d).FirstOrDefault();
- if (backCapture != null)
- {
- MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
- settings.VideoDeviceId = backCapture.Id; //设备ID
- settings.StreamingCaptureMode = StreamingCaptureMode.Video;
- settings.PhotoCaptureSource = PhotoCaptureSource.Auto;
- // 初始化
- m_capture = new MediaCapture();
- await m_capture.InitializeAsync(settings);
- m_iscaptureCreated = true;
- }
- }
- /// <summary>
- /// 获取摄像头设备列表(前置,后置摄像头)
- /// </summary>
- /// <returns></returns>
- private async static Task<DeviceInformation[]> GetCaptureDeviceseAsync ()
- {
- var dvs = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
- return dvs.ToArray();
- }
- /// <summary>
- /// 清理捕捉对象
- /// </summary>
- /// <returns></returns>
- public static void CleanupCaptureAsync ()
- {
- if (m_capture != null)
- {
- m_capture.Dispose();
- m_capture = null;
- m_iscaptureCreated = false;
- }
- }
- public static void OpenTorch ()
- {
- // 开闪光灯
- var vdcontrol = m_capture.VideoDeviceController.TorchControl;
- if (vdcontrol.Supported)
- {
- vdcontrol.Enabled = true;
- m_istorchOpened = true;
- }
- }
- public static void CloseTorch ()
- {
- // 关闭闪光灯
- var torch = m_capture.VideoDeviceController.TorchControl;
- if (torch.Supported)
- {
- torch.Enabled = false;
- m_istorchOpened = false;
- }
- }
- #endregion
- }
其他的与前面我给大家分享过的“解决调用摄像头时死机”的代码一样,都是一个思路。重点是看:
- // 开摄像灯
- var vdcontrol = m_capture.VideoDeviceController.TorchControl;
- if (vdcontrol.Supported)
- {
- vdcontrol.Enabled = true;
- m_istorchOpened = true;
- }
- ……
- // 关闭摄像灯
- var torch = m_capture.VideoDeviceController.TorchControl;
- if (torch.Supported)
- {
- torch.Enabled = false;
- m_istorchOpened = false;
- }
这才是手电筒的关键代码。
另外一点,我前面也说过,在应用程序挂起或关闭时一定要把MediaCapture对象Dispose掉,不然系统资源被占用,会导致卡死。当应用程序继续运行重新初始化。
- public App()
- {
- this.InitializeComponent();
- this.Suspending += this.OnSuspending;
- this.Resuming += this.OnResuming;
- this.UnhandledException += App_UnhandledException;
- }
- void App_UnhandledException ( object sender, UnhandledExceptionEventArgs e )
- {
- System.Diagnostics.Debug.WriteLine(e.Exception.Message);
- CaptureOperator.CleanupCaptureAsync();
- }
- private async void OnResuming ( object sender, object e )
- {
- await CaptureOperator.CreateCaptureAsync();
- }
- private void OnSuspending(object sender, SuspendingEventArgs e)
- {
- var deferral = e.SuspendingOperation.GetDeferral();
- // TODO: 保存应用程序状态并停止任何后台活动
- CaptureOperator.CleanupCaptureAsync();
- deferral.Complete();
- }
示例代码下载:http://files.cnblogs.com/tcjiaan/FlashlightApp.zip
【WP开发】手电筒的更多相关文章
- WP开发资源
wp开发:连续两次点击返回键退出程序的设计: http://hi.baidu.com/youngytj/item/6be317719cc371306cc37ce4 X http://www.cnblo ...
- WP开发笔记——WP7 SDK使用技巧
俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 W ...
- 在知乎回答的一个问题:C#初学者以后往WP开发走,还是往unity3d走?哪个更有前景呢
问题原文:我是一个C#初学者,想问个问题,我以后是该往WP开发方向走呢还是学习Unity3D往游戏开发,哪个更有前景呢,个人感觉未来几年iOS,WP,Java会三足鼎立,WP现在有潜力,但是U3D现在 ...
- WP开发使用BingMaps地图服务
原文:WP开发使用BingMaps地图服务 WP8使用BingMaps地图在 SOAP服务如何计算路径 首先需要用到3个服务 1.GeoCode服务-转换地址到地理的经纬度(WebServices地址 ...
- WP 开发中.xaml 与.xaml.cs
关于 WP 开发中.xaml 与.xaml.cs 的关系 今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: ...
- 系统不支持WP开发
好伤心,,,系统不支持WP开发... 买的ThinkPad S5 自带的win8,既不属于专业版,也不属于家庭版,,不属于各种版本. 其他条件都满足了.. 难道我要还系统吗??
- asp.net简述WP开发模式
详情请参考菜鸟教程:http://www.runoob.com/aspnet/aspnet-tutorial.html 1.ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器 ...
- 关于 WP 开发中.xaml 与.xaml.cs 的关系
今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...
- 【WP开发】读写剪贴板
在WP 8.1中只有Silverlight App支持操作剪贴板的API,Runtime App并不支持.不过,在WP 10中也引入了可以操作剪贴板的API. 顺便说点题外话,有人会说,我8.1的开发 ...
随机推荐
- src与 href 的一些区别
src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src 是 source 的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置:在请求 src 资源时会将其指 ...
- (完全背包 大数)Dollar Dayz (POJ 3181)
http://poj.org/problem?id=3181 Description Farmer John goes to Dollar Days at The Cow Store and disc ...
- iOS开发零基础--Swift教程 字符串的利用
字符串的介绍 字符串在任何的开发中使用都是非常频繁的 OC和Swift中字符串的区别 在OC中字符串类型时NSString,在Swift中字符串类型是String OC中字符串@"" ...
- oracle 11g RAC public/virtual/SACN/private IP we need to know
1.3.2.2 IP Address Requirements Before starting the installation, you must have at least two interfa ...
- I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题
I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题 http://mssqlwiki.com/2012/08/ ...
- 高性能网站架构设计之缓存篇(2)- Redis C#客户端
在上一篇中我简单的介绍了如何利用redis自带的客户端连接server并执行命令来操作它,但是如何在我们做的项目或产品中操作这个强大的内存数据库呢?首先我们来了解一下redis的原理吧. 官方文档上是 ...
- sql server 写性能优化
潜在的方案是: (1)2014版本的内存表 (2)表分区,将表数据存放在多个硬盘上. (3)采用SSD磁盘阵列. (4)不重要的表关闭事务日志.??
- .NET面试题解析(11)-SQL语言基础及数据库基本原理
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 本文内容涉及到基本SQL语法,数据的基本存储原理,数据库一些概念.数据优化等.抱砖引玉,权当一个综合复习! ...
- Java语法糖3:泛型
泛型初探 在泛型(Generic type或Generics)出现之前,是这么写代码的: public static void main(String[] args) { List list = ne ...
- 浅谈Excel开发:四 Excel 自定义函数
我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些时候,结合业务要求,这些函数可能不能满足我们的需求,比如我想要一个函数能够从WebService上获取某只 ...