【WP7】调用系统LED灯

时间:2021-04-18 03:13:02

通过使用相机的闪光灯,我们可以用来做一些类似手电筒的应用,但是WP7 SDK并没有提供调用系统LED灯的API

通过几天的尝试和搜索,终于让LED灯开了,感谢Den DelimarskyTomas Hounsell

How VideoCamera/PhotoCamera content is saved on Windows Phone 7

Not your regular photo and video camera on Windows Phone 7

Avoiding Reflection: Adding the InteropServices library to the WP7 SDK

 

开启闪光灯两种途径

1、拍照对焦

  通过自定义相机应用PhotoCamera,调用相机的Focus方法,可以让闪光灯开启1秒钟左右,连续调用Focus方法虽然能保持开启闪光灯,但是会出现闪烁,而且对相机的伤害比较大

2、录像

  在录像的时候可以打开闪光灯,但是微软并没有为我们提供关于自定义摄像功能的应用。但是还是有办法的,下面介绍这种方法

方法:

首先程序要用到一个库,后面有下载:

Microsoft.Phone.Media.Extended.dll

修改该库文件的名字为Microsoft.Phone.Media.Extended.dll,复制到WP7 SDK的库文件存放目录中

C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71

C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\RedistList 目录下找到 FrameworkList.Xml文件

找到

<File AssemblyName="Microsoft.Phone.Interop" Version="7.0.0.0" PublicKeyToken="24eec0d8c86cda1e" Culture="neutral" ProcessorArchitecture="MSIL" InGac="false" />

 

改 “Microsoft.Phone.Interop” 为“Microsoft.Phone.InteropServices”,删除 “PublicKeyToken”属性  

<File AssemblyName="Microsoft.Phone.InteropServices" Version="7.0.0.0" Culture="neutral" ProcessorArchitecture="MSIL" InGac="false" />

   注意:需要管理员的权限才能修改,(我是复制到外面来,修改完后替换掉原来那个)

到这里Microsoft.Phone.Media.Extended.dll就可以使用了(可以使用VideoCamera类了)

 

2)强名称

 

使用Visual Studio的sn.exe工具,对DLL文件进行强名称验证,打开MSDOS命令行窗口或VS的命令行提示窗口,输入命令(复制粘贴即可)。注意运行命令行窗口时必须选择以“管理员身份运行”的模式(鼠标右键菜单中有)。

 

sn -Vr "C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\Microsoft.Phone.Media.Extended.dll"

 

  下面说说VideoCamera类的使用

使用到的命名空间

  using Microsoft.Phone;

声明变量

  VideoCamera vCam;
  CameraVisualizer cView;

实例化(一般放在OnNavigatedTo函数中)

  注意:需要一个CameraVisualizer对象来配合VideoCamera作为其视频输出,否则VideoCamera不能正常工作,在主线程中创建CameraVisualizer并最后调用其SetCource方法将VideoCamera对象传入后,才能使用VideoCamera对象 

    vCam = new VideoCamera(CameraSource.PrimaryCamera);

cView
= new CameraVisualizer();
cView.Visibility = System.Windows.Visibility.Collapsed;
cView.SetSource(vCam);

使用VideoCamera的闪光灯

    if (vCam.IsRecording)
{
vCam.StopRecording();
}
else
{
vCam.LampEnabled
= true;
vCam.StartRecording();
}

在不适用VideoCamera的时候应该释放对资源的占用(一般在OnNavigatedFrom函数中)

    if (vCam != null)
{
if (vCam.IsRecording)
vCam.StopRecording();
vCam.Dispose();
vCam
= null;
}
if (cView != null)
{
LayoutRoot.Children.Remove(cView);
cView
= null;
}
GC.Collect();

 关于VideoCamera的使用请大家自行探索吧,此处不详讲

 

最后说明一下:此方法实现的应用程序不能提交通过应用商店的验证,据说可以把Microsoft.Phone.Media.Extended.dll链接库通过反射的方法加载到全局缓存中(不太懂),然后调用,好像可以通过认证,大家可以试试,欢迎交流