Android如何打开闪光灯

来源:互联网 发布:mac版chrome插件 编辑:程序博客网 时间:2024/04/28 07:31

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) {// OKreturn 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 existsif (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 flashif (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 existsif (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 flashif (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();// OKreturn 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);}}}
原创粉丝点击