Android开启闪光灯的几种办法

来源:Linux社区  作者:lincyang

一、控制硬件的情节

早在2008年开发Symbian和WM 程序的时候,就非常好奇如何用我们的代码来控制硬件设备,比如闪光灯就是一个很好的控制对象。我们开发程序,很多乐趣就在于控制。这是一种精神上的愉悦, 无论在哪个领域,控制其他事物都是很吸引人的。那么转眼间到了2012年,Android开发也做了几年了,控制它的硬件却一直没有时间做,真是惭愧。今 天得空,学习了一下,控制闪光灯大致有两种办法。下面就一一道来。

二、用IHardwareService直接控制

Android1.5以前是直接提供这个接口的,之后呢,需要我们自己来做一下。

在你的项目中新建一个包Android.os,新建一个IHardwareService.aidl文件,内容如下:

    package Android.os;  
      
    /** {@hide} */  
    interface IHardwareService  
    {  
        // obsolete flashlight support   
        boolean getFlashlightEnabled();  
        void setFlashlightEnabled(boolean on);  
    }

 



然后在你的程序中引入

    import Android.os.IHardwareService;  
      
        /**
         * 设置闪光灯的开启和关闭
         * @param isEnable
         * @author linc
         * @date 2012-3-18
         */  
        private void setFlashlightEnabled(boolean isEnable)  
        {  
            try  
            {  
                Method method = Class.forName("Android.os.ServiceManager").getMethod("getService", String.class);  
                IBinder binder = (IBinder) method.invoke(null, new Object[] { "hardware" });  
                  
                IHardwareService localhardwareservice = IHardwareService.Stub.asInterface(binder);  
                localhardwareservice.setFlashlightEnabled(isEnable);  
            }  
            catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
              
        }  

 


这样就可以开启闪光灯了。要使用的权限:

    <uses-permission Android:name="android.permission.FLASHLIGHT" />  
        <uses-permission Android:name="android.permission.HARDWARE_TEST" />

 



三、用照相机来控制闪光灯

这是思维的另一个方向。Camera自带丰富的接口与Parameters,我们只管拿来使用就好了。

    private Camera camera = null;  
        private Parameters parameters = 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方法:

    private void OpenLightOn()    {  
        if ( null == m_Camera )  
        {  
            m_Camera = Camera.open();      
        }  
          
        Camera.Parameters parameters = m_Camera.getParameters();               
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);    
        m_Camera.setParameters( parameters );             
        m_Camera.autoFocus( new Camera.AutoFocusCallback (){    
        public void onAutoFocus(boolean success, Camera camera) {    
                }                   
            });   
        m_Camera.startPreview();      
    }  
      
    private void CloseLightOff()   {  
        if ( m_Camera != null )  
        {  
            m_Camera.stopPreview();  
            m_Camera.release();  
            m_Camera = null;  
        }         
    }  

 

四、结束

posted @ 2012-08-18 13:09  elon  阅读(5788)  评论(0)    收藏  举报