來源: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; } }
四、結束