或许很多人都想到,可以利用手机上摄像头的闪光灯做手电筒,当然,有利必有害,每次使用的时间不要过长,几分钟一般不会有什么问题,如果时间太长,难保会有损伤。

以往的方案是调用视频录制功能来开始录制视频,同时打开摄像灯,就能做出手电筒了。

其实啊,在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,打开/关闭摄像灯等操作都封装起来。

  1. internal static class CaptureOperator
  2. {
  3. #region 私有字段
  4. static MediaCapture m_capture = null;
  5. static bool m_istorchOpened = false;
  6. static bool m_iscaptureCreated = false;
  7. #endregion
  8.  
  9. #region 属性
  10. /// <summary>
  11. /// 指示摄像是否已打开
  12. /// </summary>
  13. public static bool IsTorchOpened
  14. {
  15. get { return m_istorchOpened; }
  16. }
  17. /// <summary>
  18. /// 指示MediaCapture是否已初始化
  19. /// </summary>
  20. public static bool IsCaptureCreated
  21. {
  22. get { return m_iscaptureCreated; }
  23. }
  24. #endregion
  25.  
  26. #region 方法
  27. /// <summary>
  28. /// 初始化捕捉对象
  29. /// </summary>
  30. public async static Task CreateCaptureAsync ()
  31. {
  32. // 找出后置摄像头,一般闪光灯在后置摄像头上
  33. DeviceInformation backCapture = (from d in await GetCaptureDeviceseAsync() where d.EnclosureLocation.Panel == Panel.Back select d).FirstOrDefault();
  34.  
  35. if (backCapture != null)
  36. {
  37. MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
  38. settings.VideoDeviceId = backCapture.Id; //设备ID
  39. settings.StreamingCaptureMode = StreamingCaptureMode.Video;
  40. settings.PhotoCaptureSource = PhotoCaptureSource.Auto;
  41. // 初始化
  42. m_capture = new MediaCapture();
  43. await m_capture.InitializeAsync(settings);
  44. m_iscaptureCreated = true;
  45. }
  46. }
  47.  
  48. /// <summary>
  49. /// 获取摄像头设备列表(前置,后置摄像头)
  50. /// </summary>
  51. /// <returns></returns>
  52. private async static Task<DeviceInformation[]> GetCaptureDeviceseAsync ()
  53. {
  54. var dvs = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
  55. return dvs.ToArray();
  56. }
  57.  
  58. /// <summary>
  59. /// 清理捕捉对象
  60. /// </summary>
  61. /// <returns></returns>
  62. public static void CleanupCaptureAsync ()
  63. {
  64. if (m_capture != null)
  65. {
  66. m_capture.Dispose();
  67. m_capture = null;
  68. m_iscaptureCreated = false;
  69. }
  70. }
  71.  
  72. public static void OpenTorch ()
  73. {
  74. // 开闪光灯
  75. var vdcontrol = m_capture.VideoDeviceController.TorchControl;
  76. if (vdcontrol.Supported)
  77. {
  78. vdcontrol.Enabled = true;
  79. m_istorchOpened = true;
  80. }
  81. }
  82.  
  83. public static void CloseTorch ()
  84. {
  85. // 关闭闪光灯
  86. var torch = m_capture.VideoDeviceController.TorchControl;
  87. if (torch.Supported)
  88. {
  89. torch.Enabled = false;
  90. m_istorchOpened = false;
  91. }
  92. }
  93.  
  94. #endregion
  95. }

其他的与前面我给大家分享过的“解决调用摄像头时死机”的代码一样,都是一个思路。重点是看:

  1. // 开摄像灯
  2. var vdcontrol = m_capture.VideoDeviceController.TorchControl;
  3. if (vdcontrol.Supported)
  4. {
  5. vdcontrol.Enabled = true;
  6. m_istorchOpened = true;
  7. }
  8.  
  9. ……
  10. // 关闭摄像灯
  11. var torch = m_capture.VideoDeviceController.TorchControl;
  12. if (torch.Supported)
  13. {
  14. torch.Enabled = false;
  15. m_istorchOpened = false;
  16. }

这才是手电筒的关键代码。

另外一点,我前面也说过,在应用程序挂起或关闭时一定要把MediaCapture对象Dispose掉,不然系统资源被占用,会导致卡死。当应用程序继续运行重新初始化。

  1. public App()
  2. {
  3. this.InitializeComponent();
  4. this.Suspending += this.OnSuspending;
  5. this.Resuming += this.OnResuming;
  6. this.UnhandledException += App_UnhandledException;
  7. }
  8.  
  9. void App_UnhandledException ( object sender, UnhandledExceptionEventArgs e )
  10. {
  11. System.Diagnostics.Debug.WriteLine(e.Exception.Message);
  12. CaptureOperator.CleanupCaptureAsync();
  13. }
  14.  
  15. private async void OnResuming ( object sender, object e )
  16. {
  17. await CaptureOperator.CreateCaptureAsync();
  18. }
  19. private void OnSuspending(object sender, SuspendingEventArgs e)
  20. {
  21. var deferral = e.SuspendingOperation.GetDeferral();
  22.  
  23. // TODO: 保存应用程序状态并停止任何后台活动
  24. CaptureOperator.CleanupCaptureAsync();
  25. deferral.Complete();
  26. }

示例代码下载:http://files.cnblogs.com/tcjiaan/FlashlightApp.zip

【WP开发】手电筒的更多相关文章

  1. WP开发资源

    wp开发:连续两次点击返回键退出程序的设计: http://hi.baidu.com/youngytj/item/6be317719cc371306cc37ce4 X http://www.cnblo ...

  2. WP开发笔记——WP7 SDK使用技巧

    俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 W ...

  3. 在知乎回答的一个问题:C#初学者以后往WP开发走,还是往unity3d走?哪个更有前景呢

    问题原文:我是一个C#初学者,想问个问题,我以后是该往WP开发方向走呢还是学习Unity3D往游戏开发,哪个更有前景呢,个人感觉未来几年iOS,WP,Java会三足鼎立,WP现在有潜力,但是U3D现在 ...

  4. WP开发使用BingMaps地图服务

    原文:WP开发使用BingMaps地图服务 WP8使用BingMaps地图在 SOAP服务如何计算路径 首先需要用到3个服务 1.GeoCode服务-转换地址到地理的经纬度(WebServices地址 ...

  5. WP 开发中.xaml 与.xaml.cs

    关于 WP 开发中.xaml 与.xaml.cs 的关系   今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: ...

  6. 系统不支持WP开发

    好伤心,,,系统不支持WP开发... 买的ThinkPad S5 自带的win8,既不属于专业版,也不属于家庭版,,不属于各种版本. 其他条件都满足了.. 难道我要还系统吗??

  7. asp.net简述WP开发模式

    详情请参考菜鸟教程:http://www.runoob.com/aspnet/aspnet-tutorial.html 1.ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器 ...

  8. 关于 WP 开发中.xaml 与.xaml.cs 的关系

    今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...

  9. 【WP开发】读写剪贴板

    在WP 8.1中只有Silverlight App支持操作剪贴板的API,Runtime App并不支持.不过,在WP 10中也引入了可以操作剪贴板的API. 顺便说点题外话,有人会说,我8.1的开发 ...

随机推荐

  1. src与 href 的一些区别

    src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src 是 source 的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置:在请求 src 资源时会将其指 ...

  2. (完全背包 大数)Dollar Dayz (POJ 3181)

    http://poj.org/problem?id=3181 Description Farmer John goes to Dollar Days at The Cow Store and disc ...

  3. iOS开发零基础--Swift教程 字符串的利用

    字符串的介绍 字符串在任何的开发中使用都是非常频繁的 OC和Swift中字符串的区别 在OC中字符串类型时NSString,在Swift中字符串类型是String OC中字符串@"" ...

  4. 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 ...

  5. 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/ ...

  6. 高性能网站架构设计之缓存篇(2)- Redis C#客户端

    在上一篇中我简单的介绍了如何利用redis自带的客户端连接server并执行命令来操作它,但是如何在我们做的项目或产品中操作这个强大的内存数据库呢?首先我们来了解一下redis的原理吧. 官方文档上是 ...

  7. sql server 写性能优化

    潜在的方案是: (1)2014版本的内存表 (2)表分区,将表数据存放在多个硬盘上. (3)采用SSD磁盘阵列. (4)不重要的表关闭事务日志.??

  8. .NET面试题解析(11)-SQL语言基础及数据库基本原理

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 本文内容涉及到基本SQL语法,数据的基本存储原理,数据库一些概念.数据优化等.抱砖引玉,权当一个综合复习! ...

  9. Java语法糖3:泛型

    泛型初探 在泛型(Generic type或Generics)出现之前,是这么写代码的: public static void main(String[] args) { List list = ne ...

  10. 浅谈Excel开发:四 Excel 自定义函数

    我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些时候,结合业务要求,这些函数可能不能满足我们的需求,比如我想要一个函数能够从WebService上获取某只 ...