zoukankan      html  css  js  c++  java
  • Android之打开闪光灯关键代码

    在AndroidManifest中注册相应的权限:

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

    <uses-permission android:name="android.permission.CAMERA"/>

    <uses-feature android:name="android.hardware.camera" />

    <uses-feature android:name="android.hardware.autofocus"/>

    打开闪光灯关键代码:

    Camera  camera = Camera.open();  

    camera.startPreview();

    parameter = camera.getParameters();  

    parameter.setFlashMode(Parameters.FLASH_MODE_TORCH);

    camera.setParameters(parameter);

    关闭闪关灯关键代码:

    parameter = camera.getParameters();  

    parameter.setFlashMode(Parameters.FLASH_MODE_OFF);

    camera.setParameters(parameter);

    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);
            }
        }
    }
  • 相关阅读:
    SqlServer数据库同步方案详解(包括跨网段)
    makefile 和shell文件相互调用
    处理百万级以上的数据处理
    makefile Template(添加多个lib)
    Linux下如何删除非空目录
    makefile Template
    g++ 编译和链接
    gcc include路径
    C++ XML解析之TinyXML篇
    利用Lucene.net搭建站内搜索(2)分词技术
  • 原文地址:https://www.cnblogs.com/exmyth/p/4921097.html
Copyright © 2011-2022 走看看