package com.eighteengray.procameralibrary.camera;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.MeteringRectangle;
import android.view.Surface;
import android.view.WindowManager;
import com.eighteengray.procameralibrary.common.Constants;
import com.eighteengray.procameralibrary.gpufilter.GpuFilterModel;
import java.util.List;
import static com.eighteengray.procameralibrary.camera.Camera2TextureView.ORIENTATIONS;
public class CaptureRequestFactory
{
//创建预览请求,后面的setXXX方法是根据不同情况设置预览参数
public static CaptureRequest.Builder createPreviewBuilder(CameraDevice cameraDevice, Surface surface) throws CameraAccessException
{
CaptureRequest.Builder previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewBuilder.addTarget(surface);
return previewBuilder;
}
//设置预览-自动聚焦模式
public static void setPreviewBuilderPreview(CaptureRequest.Builder previewBuilder) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
/*previewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_AUTO);
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
previewBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO);
previewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_OFF);
previewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 5.0f);
previewBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long) ((214735991 - 13231) / 2));
previewBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
previewBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, (10000 - 100) / 2);*/
}
//设置预览-锁定焦点
public static void setPreviewBuilderLockfocus(CaptureRequest.Builder previewBuilder) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
}
//设置预览-解除锁定焦点
public static void setPreviewBuilderUnlockfocus(CaptureRequest.Builder previewBuilder) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
}
//设置预览-聚焦区域
public static void setPreviewBuilderFocusRegion(CaptureRequest.Builder previewBuilder, MeteringRectangle[] meteringRectangleArr) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, meteringRectangleArr);
previewBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectangleArr);
previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
}
//设置预览-开始手动聚焦
public static void setPreviewBuilderFocusTrigger(CaptureRequest.Builder previewBuilder) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
previewBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);
}
//设置预览-闪光灯模式
public static CaptureRequest setPreviewBuilderFlash(CaptureRequest.Builder previewBuilder, int flashMode) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
switch (flashMode)
{
case Constants.FLASH_AUTO:
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH);
break;
case Constants.FLASH_ON:
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
previewBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);
break;
case Constants.FLASH_OFF:
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
previewBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
break;
case Constants.FLASH_FLARE:
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
previewBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
break;
}
return previewBuilder.build();
}
//设置预览-Scene模式
public static CaptureRequest setPreviewBuilderScene(CaptureRequest.Builder previewBuilder, String scene) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, GpuFilterModel.getSceneMode(scene));
return previewBuilder.build();
}
//设置预览-Effect模式
public static CaptureRequest setPreviewBuilderEffect(CaptureRequest.Builder previewBuilder, String effect) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, GpuFilterModel.getEffectMode(effect));
return previewBuilder.build();
}
//创建拍照请求
public static CaptureRequest.Builder createCaptureStillBuilder(CameraDevice cameraDevice, Surface surface) throws CameraAccessException
{
CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(surface);
return captureBuilder;
}
//设置拍照模式-拍静态图片
public static void setCaptureBuilderStill(CaptureRequest.Builder captureBuilder, WindowManager windowManager) throws CameraAccessException
{
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
int rotation = windowManager.getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
}
//设置拍照模式-连续拍摄
public static void setCaptureBuilderPrecapture(CaptureRequest.Builder captureBuilder) throws CameraAccessException
{
captureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
}
//设置拍照模式-延时拍着
public static void setCaptureBuilderDelay(CaptureRequest.Builder captureBuilder)
{
// captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 10000);
}
//创建录像请求
public static CaptureRequest.Builder createRecordBuilder(CameraDevice cameraDevice, List<Surface> surfaces) throws CameraAccessException
{
CaptureRequest.Builder recordBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
recordBuilder.addTarget(surfaces.get(0));
recordBuilder.addTarget(surfaces.get(1));
return recordBuilder;
}
//设置预览模式-录像预览
public static void setPreviewBuilderRecordPreview(CaptureRequest.Builder previewBuilder) throws CameraAccessException
{
previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);
// previewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
}
}