【WP7】调用系统LED灯
通过使用相机的闪光灯,我们可以用来做一些类似手电筒的应用,但是WP7 SDK并没有提供调用系统LED灯的API
通过几天的尝试和搜索,终于让LED灯开了,感谢Den Delimarsky和Tomas 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链接库通过反射的方法加载到全局缓存中(不太懂),然后调用,好像可以通过认证,大家可以试试,欢迎交流