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

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

其实啊,在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开发】手电筒的更多相关文章

  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. ASP.NET Web服务调用发生错误,错误代码404

    现象: iOS端使用ASIHTTP连接Web服务时,得到的数据是一个错误代码为404的页面,错误信息(web.config添加<customErrors mode="Off" ...

  2. DedeCMS织梦系统head.htm里无法调用栏目描述

    {dede:channel type='top'} [field:description/] {/dede:channel} channel 这个标签没有description属性你需要自己把这个属性 ...

  3. php面试题及答案收藏(转)

    php面试题及答案收藏(这套试题是在网上看到的,不知作者是谁) 基础题 1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据, ...

  4. 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

    在调用部分三方库时,由于三方库是基于.NET2.0的.所以在4.0的程序中无法加载.解决方案如下: 在配置文件中添加以下配置 <?xml version="1.0"?> ...

  5. java多线程(精华版)

    在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持.本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观.读完本文以后,用户应 ...

  6. oracle ORA-12514: TNS: no listener 解决方案

    服务端:oracle 11g 客户端: pl/sql 问题描述: 用客户端 pl/sql 连接登录的时候,提示 "ORA-12514: TNS: no listener". 在服务 ...

  7. C++混合编程之idlcpp教程Lua篇(9)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.c ...

  8. javascript event兼容性随笔

    一.前言 function ConvertEvent(e, element) { var event = e || window.event; var resultEvent = { event: e ...

  9. Linux计划任务crontab运行脚本不正确的问题

    问题的由来 写好的程序希望在崩溃之后能够自启动,于是利用linux的crontab功能,添加一个计划任务,每分钟执行一个脚本查看需要监控的进程是否还在,如果不在则启动之,否则不做任何事情.这么一个简单 ...

  10. Doc转文本

    微软方案VC 原文:http://www.cnblogs.com/eaglet/archive/2013/01/10/2854224.html 从 http://ifilter.codeplex.co ...