Android如何打開閃光燈
在android中打開閃光燈的方法有兩種,一種是獲取硬件服務,通過反射的方式來操作閃光燈。另外一種是獲得Camera對象,通過設置Camera的參數來操作閃光燈。一下是一個操作閃光燈的工具類:實現了兩種方式操作閃光燈。通過switchFlashlight方法是通過反射的方式操作,通過turnLightOn,turnLightOff方法操作是通過設置Camera來操作閃關燈的。通過反射的方法貌似在4.0以上的版本中都不好用了,建議使用設置攝像頭參數的方式來操作。
- public class FlashlightManager {
- private static final String TAG = FlashlightManager.class.getSimpleName();
- private static final Object iHardwareService;
- private static final Method setFlashEnabledMethod;
- static {
- iHardwareService = getHardwareService();
- setFlashEnabledMethod = getSetFlashEnabledMethod(iHardwareService);
- if (iHardwareService == null) {
- Log.v(TAG, "This device does supports control of a flashlight");
- } else {
- Log.v(TAG, "This device does not support control of a flashlight");
- }
- }
- private FlashlightManager() {
- }
- private static Object getHardwareService() {
- Class<?> serviceManagerClass = maybeForName("android.os.ServiceManager");
- if (serviceManagerClass == null) {
- return null;
- }
- Method getServiceMethod = maybeGetMethod(serviceManagerClass,
- "getService", String.class);
- if (getServiceMethod == null) {
- return null;
- }
- Object hardwareService = invoke(getServiceMethod, null, "hardware");
- if (hardwareService == null) {
- return null;
- }
- Class<?> iHardwareServiceStubClass = maybeForName("android.os.IHardwareService$Stub");
- if (iHardwareServiceStubClass == null) {
- return null;
- }
- Method asInterfaceMethod = maybeGetMethod(iHardwareServiceStubClass,
- "asInterface", IBinder.class);
- if (asInterfaceMethod == null) {
- return null;
- }
- return invoke(asInterfaceMethod, null, hardwareService);
- }
- private static Method getSetFlashEnabledMethod(Object iHardwareService) {
- if (iHardwareService == null) {
- return null;
- }
- Class<?> proxyClass = iHardwareService.getClass();
- return maybeGetMethod(proxyClass, "setFlashlightEnabled", boolean.class);
- }
- private static Class<?> maybeForName(String name) {
- try {
- return Class.forName(name);
- } catch (ClassNotFoundException cnfe) {
- // OK
- return null;
- } catch (Exception re) {
- re.printStackTrace();
- Log.w(TAG, "Unexpected error while finding class " + name, re);
- return null;
- }
- }
- /**
- * 通過設置Camera打開閃光燈
- * @param mCamera
- */
- public static void turnLightOn(Camera mCamera) {
- if (mCamera == null) {
- return;
- }
- Parameters parameters = mCamera.getParameters();
- if (parameters == null) {
- return;
- }
- List<String> flashModes = parameters.getSupportedFlashModes();
- // Check if camera flash exists
- if (flashModes == null) {
- // Use the screen as a flashlight (next best thing)
- return;
- }
- String flashMode = parameters.getFlashMode();
- Log.i(TAG, "Flash mode: " + flashMode);
- Log.i(TAG, "Flash modes: " + flashModes);
- if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
- // Turn on the flash
- if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
- parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
- mCamera.setParameters(parameters);
- } else {
- }
- }
- }
- /**
- * 通過設置Camera關閉閃光燈
- * @param mCamera
- */
- public static void turnLightOff(Camera mCamera) {
- if (mCamera == null) {
- return;
- }
- Parameters parameters = mCamera.getParameters();
- if (parameters == null) {
- return;
- }
- List<String> flashModes = parameters.getSupportedFlashModes();
- String flashMode = parameters.getFlashMode();
- // Check if camera flash exists
- if (flashModes == null) {
- return;
- }
- Log.i(TAG, "Flash mode: " + flashMode);
- Log.i(TAG, "Flash modes: " + flashModes);
- if (!Parameters.FLASH_MODE_OFF.equals(flashMode)) {
- // Turn off the flash
- if (flashModes.contains(Parameters.FLASH_MODE_OFF)) {
- parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
- mCamera.setParameters(parameters);
- } else {
- Log.e(TAG, "FLASH_MODE_OFF not supported");
- }
- }
- }
- private static Method maybeGetMethod(Class<?> clazz, String name,
- Class<?>... argClasses) {
- try {
- return clazz.getMethod(name, argClasses);
- } catch (Exception nsme) {
- nsme.printStackTrace();
- // OK
- return null;
- }
- }
- private static Object invoke(Method method, Object instance, Object... args) {
- try {
- return method.invoke(instance, args);
- } catch (Exception e) {
- Log.w(TAG, "Unexpected error while invoking " + method, e);
- return null;
- }
- }
- /**
- * 通過反射來操作閃光燈
- * @param active
- */
- public static void switchFlashlight(boolean active) {
- setFlashlight(active);
- }
- static void disableFlashlight() {
- setFlashlight(false);
- }
- private static void setFlashlight(boolean active) {
- if (iHardwareService != null) {
- invoke(setFlashEnabledMethod, iHardwareService, active);
- }
- }
- }