一、控制硬件的情节
早在2008年开发Symbian和WM程序的时候,就非常好奇如何用我们的代码来控制硬件设备,比如闪光灯就是一个很好的控制对象。我们开发程序,很多乐趣就在于控制。这是一种精神上的愉悦,无论在哪个领域,控制其他事物都是很吸引人的。那么转眼间到了2012年,Android开发也做了几年了,控制它的硬件却一直没有时间做,真是惭愧。今天得空,学习了一下,控制闪光灯大致有两种办法。下面就一一道来。
二、用IHardwareService直接控制
Android1.5以前是直接提供这个接口的,之后呢,需要我们自己来做一下。
在你的项目中新建一个包Android.os,新建一个IHardwareService.aidl文件,内容如下:
- packageAndroid.os;
- /**{@hide}*/
- interfaceIHardwareService
- {
- //obsoleteflashlightsupport
- booleangetFlashlightEnabled();
- voidsetFlashlightEnabled(booleanon);
- }
然后在你的程序中引入
- importAndroid.os.IHardwareService;
- /**
- *设置闪光灯的开启和关闭
- *@paramisEnable
- *@authorlinc
- *@date2012-3-18
- */
- privatevoidsetFlashlightEnabled(booleanisEnable)
- {
- try
- {
- Methodmethod=Class.forName("Android.os.ServiceManager").getMethod("getService",String.class);
- IBinderbinder=(IBinder)method.invoke(null,newObject[]{"hardware"});
- IHardwareServicelocalhardwareservice=IHardwareService.Stub.asInterface(binder);
- localhardwareservice.setFlashlightEnabled(isEnable);
- }
- catch(Exceptione)
- {
- e.printStackTrace();
- }
- }
这样就可以开启闪光灯了。要使用的权限:
- <uses-permissionAndroid:name="android.permission.FLASHLIGHT"/>
- <uses-permissionAndroid:name="android.permission.HARDWARE_TEST"/>
-
三、用照相机来控制闪光灯
这是思维的另一个方向。Camera自带丰富的接口与Parameters,我们只管拿来使用就好了。
- privateCameracamera=null;
- privateParametersparameters=null;
- //直接开启
- camera=Camera.open();
- parameters=camera.getParameters();
- parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);//开启
- camera.setParameters(parameters);
- //直接关闭
- parameters.setFlashMode(Parameters.FLASH_MODE_OFF);//关闭
- camera.setParameters(parameters);
- camera.release();
如果这样遇到问题的话,可以尝试用camera的preview方法:
- privatevoidOpenLightOn(){
- if(null==m_Camera)
- {
- m_Camera=Camera.open();
- }
- Camera.Parametersparameters=m_Camera.getParameters();
- parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
- m_Camera.setParameters(parameters);
- m_Camera.autoFocus(newCamera.AutoFocusCallback(){
- publicvoidonAutoFocus(booleansuccess,Cameracamera){
- }
- });
- m_Camera.startPreview();
- }
- privatevoidCloseLightOff(){
- if(m_Camera!=null)
- {
- m_Camera.stopPreview();
- m_Camera.release();
- m_Camera=null;
- }
- }