Android 5, camera2 use only flash

后端 未结 4 2010
生来不讨喜
生来不讨喜 2020-11-30 05:27

I need to use only the flash with the API camera2 (Android 5, API level 21), like torch applications. But all the examples that I found requires the display of camera strea

4条回答
  •  萌比男神i
    2020-11-30 05:27

    Just use following class to turn on/off FlashLight in Android L,

    public class FlashLightUtilForL {
        private CameraCaptureSession mSession;
        private CaptureRequest.Builder mBuilder;
        private CameraDevice mCameraDevice;
        private CameraManager mCameraManager;
    
        public FlashLightUtilForL(Context context) {
            try {
                mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
                //here to judge if flash is available
                CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics("0");
                boolean flashAvailable = cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
                if (flashAvailable) {
                    mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null);
                } else {
                    //todo: throw Exception
                }
                //mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        class MyCameraDeviceStateCallback extends CameraDevice.StateCallback {
    
            @Override
            public void onOpened(CameraDevice camera) {
                mCameraDevice = camera;
                //get builder
                try {
                    mBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_MANUAL);
                    //flash on, default is on
                    mBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AF_MODE_AUTO);
                    mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
                    List list = new ArrayList();
                    SurfaceTexture mSurfaceTexture = new SurfaceTexture(1);
                    Size size = getSmallestSize(mCameraDevice.getId());
                    mSurfaceTexture.setDefaultBufferSize(size.getWidth(), size.getHeight());
                    Surface mSurface = new Surface(mSurfaceTexture);
                    list.add(mSurface);
                    mBuilder.addTarget(mSurface);
                    camera.createCaptureSession(list, new MyCameraCaptureSessionStateCallback(), null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void onDisconnected(CameraDevice camera) {
    
            }
    
            @Override
            public void onError(CameraDevice camera, int error) {
    
            }
        }
    
        private Size getSmallestSize(String cameraId) throws CameraAccessException {
            Size[] outputSizes = mCameraManager.getCameraCharacteristics(cameraId)
                    .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
                    .getOutputSizes(SurfaceTexture.class);
            if (outputSizes == null || outputSizes.length == 0) {
                throw new IllegalStateException(
                        "Camera " + cameraId + "doesn't support any outputSize.");
            }
            Size chosen = outputSizes[0];
            for (Size s : outputSizes) {
                if (chosen.getWidth() >= s.getWidth() && chosen.getHeight() >= s.getHeight()) {
                    chosen = s;
                }
            }
            return chosen;
        }
    
        /**
         * session callback
         */
        class MyCameraCaptureSessionStateCallback extends CameraCaptureSession.StateCallback {
    
            @Override
            public void onConfigured(CameraCaptureSession session) {
                mSession = session;
                try {
                    mSession.setRepeatingRequest(mBuilder.build(), null, null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void onConfigureFailed(CameraCaptureSession session) {
    
            }
        }
    
        public void turnOnFlashLight() {
            try {
                mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
                mSession.setRepeatingRequest(mBuilder.build(), null, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void turnOffFlashLight() {
            try {
                mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
                mSession.setRepeatingRequest(mBuilder.build(), null, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private void close() {
            if (mCameraDevice == null || mSession == null) {
                return;
            }
            mSession.close();
            mCameraDevice.close();
            mCameraDevice = null;
            mSession = null;
        }
    }
    

提交回复
热议问题