下面列出了怎么用android.hardware.camera2.CaptureRequest的API类实例代码及写法,或者点击链接到github查看源代码。
public void shotPhoto(){
try {
CaptureRequest.Builder captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(mImageReader.getSurface());
// 自动对焦
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 自动曝光
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, mOrientation);
CaptureRequest captureRequest = captureRequestBuilder.build();
mCameraCaptureSession.capture(captureRequest, null, mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
/**
* Updates the internal state of auto-focus to {@link #mAutoFocus}.
*/
void updateAutoFocus() {
if (mAutoFocus) {
int[] modes = mCameraCharacteristics.get(
CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
// Auto focus is not supported
if (modes == null || modes.length == 0 ||
(modes.length == 1 && modes[0] == CameraCharacteristics.CONTROL_AF_MODE_OFF)) {
mAutoFocus = false;
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_OFF);
} else {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
}
} else {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_OFF);
}
}
/**
* Generate a human-readable string of the given capture request and write
* it to the given file.
*/
public static void toFile(String title, CameraMetadata<?> metadata, File file)
{
try
{
// Will append if the file already exists.
FileWriter writer = new FileWriter(file, true);
if (metadata instanceof CaptureRequest)
{
dumpMetadata(title, (CaptureRequest) metadata, writer);
} else if (metadata instanceof CaptureResult)
{
dumpMetadata(title, (CaptureResult) metadata, writer);
} else
{
writer.close();
throw new IllegalArgumentException("Cannot generate debug data from type "
+ metadata.getClass().getName());
}
writer.close();
} catch (IOException ex)
{
Log.e(TAG, "Could not write capture data to file.", ex);
}
}
@Override
public int setRepeatingBurst(List<CaptureRequest> requests,
CaptureCallback callback, Handler handler) throws CameraAccessException {
checkRepeatingRequests(requests);
synchronized (mDeviceImpl.mInterfaceLock) {
checkNotClosed();
handler = checkHandler(handler, callback);
if (DEBUG) {
CaptureRequest[] requestArray = requests.toArray(new CaptureRequest[0]);
Log.v(TAG, mIdString + "setRepeatingBurst - requests " +
Arrays.toString(requestArray) + ", callback " + callback +
" handler" + "" + handler);
}
return addPendingSequence(mDeviceImpl.setRepeatingBurst(requests,
createCaptureCallbackProxy(handler, callback), mDeviceExecutor));
}
}
/**
* Unlock the focus. This method should be called when still image capture sequence is
* finished.
*/
private void unlockFocus() {
try {
// Reset the auto-focus trigger
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
if (mFlashSupported) {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, mFlashMode);
}
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
// After this, the camera will go back to the normal state of preview.
mState = STATE_PREVIEW;
mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
/**
* Unlocks the auto-focus and restart camera preview. This is supposed to be called after
* capturing a still picture.
*/
void unlockFocus() {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
try {
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, null);
updateAutoFocus();
updateFlash();
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback,
null);
mCaptureCallback.setState(PictureCaptureCallback.STATE_PREVIEW);
} catch (CameraAccessException e) {
Log.e(TAG, "Failed to restart camera preview.", e);
}
}
private void doPreviewConfiguration() {
if (mCamera == null) {
return;
}
try {
// mPreviewBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// mPreviewBuilder.addTarget(surfaceView.getHolder().getSurface());
// mPreviewBuilder.addTarget(mImageReader.getSurface());
mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
// mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
// mPreviewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
// mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, mFps[mFps.length -1 ]);
mCaptureSession.setRepeatingRequest(mPreviewBuilder.build(), mPreCaptureCallback, mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
/**
* Unlocks the auto-focus and restart camera preview. This is supposed to be called after
* capturing a still picture.
*/
void unlockFocus() {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
try {
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, null);
updateAutoFocus();
updateFlash();
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback,
null);
mCaptureCallback.setState(PictureCaptureCallback.STATE_PREVIEW);
} catch (CameraAccessException e) {
Log.e(TAG, "Failed to restart camera preview.", e);
}
}
private void setDefaultCaptureRequest(final CaptureRequest.Builder request,
final boolean trigger) {
if (hasAutoFocus()) {
request.set(CaptureRequest.CONTROL_AF_MODE, mAutoFocusMode);
if (trigger) {
request.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
}
}
if (hasAutoExposure()) {
request.set(CaptureRequest.CONTROL_AE_MODE, mAutoExposureMode);
}
setWhiteBalance(request);
// Light が ON の場合は、CONTROL_AE_MODE を CONTROL_AE_MODE_ON にする。
if (mIsTouchOn) {
mUseTouch = true;
request.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
request.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
}
}
public CaptureRequest.Builder makeFrameInjectionRequest(
long desiredExposureTimeNs, List<Surface> imageSurfaces) throws CameraAccessException {
CaptureRequest.Builder builder = device.createCaptureRequest(TEMPLATE_PREVIEW);
builder.set(CONTROL_MODE, CONTROL_MODE_AUTO);
builder.set(CONTROL_AE_MODE, CONTROL_AE_MODE_OFF);
builder.set(SENSOR_EXPOSURE_TIME, desiredExposureTimeNs);
// TODO: Inserting frame duration directly would be more accurate than inserting exposure since
// {@code frame duration ~ exposure + variable overhead}. However setting frame duration may not
// be supported on many android devices, so we use exposure time here.
List<Integer> targetIndices = new ArrayList<>();
for (int i = 0; i < imageSurfaces.size(); i++) {
builder.addTarget(imageSurfaces.get(i));
targetIndices.add(i);
}
builder.setTag(new CaptureRequestTag(targetIndices, PhaseAlignController.INJECT_FRAME));
return builder;
}
/**
* Run the precapture sequence for capturing a still image. This method should be called when
* we get a response in {@link #mCaptureCallback} from {@link #lockFocus()}.
*/
private void runPrecaptureSequence() {
try {
// This is how to tell the camera to trigger.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
// Tell #mCaptureCallback to wait for the precapture sequence to be set.
mState = STATE_WAITING_PRECAPTURE;
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
/**
* Updates the internal state of flash to {@link #mFlash}.
*/
void updateFlash() {
switch (mFlash) {
case Constants.FLASH_OFF:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON);
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE,
CaptureRequest.FLASH_MODE_OFF);
break;
case Constants.FLASH_ON:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE,
CaptureRequest.FLASH_MODE_OFF);
break;
case Constants.FLASH_TORCH:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON);
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE,
CaptureRequest.FLASH_MODE_TORCH);
break;
case Constants.FLASH_AUTO:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE,
CaptureRequest.FLASH_MODE_OFF);
break;
case Constants.FLASH_RED_EYE:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE);
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE,
CaptureRequest.FLASH_MODE_OFF);
break;
}
}
private void resetRepeating(FrameServer.Session session) throws InterruptedException,
CameraCaptureSessionClosedException, CameraAccessException,
ResourceAcquisitionFailedException
{
RequestBuilder repeatingBuilder = mRepeatingRequestBuilder.create
(mRepeatingRequestTemplate);
session.submitRequest(Arrays.asList(repeatingBuilder.build()),
FrameServer.RequestType.REPEATING);
RequestBuilder triggerCancelBuilder = mRepeatingRequestBuilder
.create(mRepeatingRequestTemplate);
triggerCancelBuilder.setParam(CaptureRequest.CONTROL_AF_TRIGGER,
CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
session.submitRequest(Arrays.asList(triggerCancelBuilder.build()),
FrameServer.RequestType.NON_REPEATING);
// Some devices (e.g. N6) implicitly lock AE after sending an
// AE_PRECAPTURE trigger. (see bug: 19265647)
// The implicit lock is released when a request with
// INTENT_STILL_CAPTURE is taken.
// However, if we never get to that point (because the command was
// interrupted before the request for a photo was sent), then we must be
// sure to cancel this implicit AE lock to resume normal AE behavior.
// Sending a request for an explicit AE lock (followed, implicitly, by a
// request from the current repeating request, which has AE lock off)
// fixes the issue and results in normal AE behavior.
RequestBuilder hackAETriggerCancelBuilder = mRepeatingRequestBuilder.create
(mRepeatingRequestTemplate);
hackAETriggerCancelBuilder.setParam(CaptureRequest.CONTROL_AE_LOCK, true);
session.submitRequest(Arrays.asList(hackAETriggerCancelBuilder.build()),
FrameServer.RequestType.NON_REPEATING);
}
private void unlockFocus() {
try {
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
captureSession.capture(previewRequestBuilder.build(), captureCallback, backgroundHandler);
previewState = STATE_PREVIEW;
captureSession.setRepeatingRequest(previewRequest, captureCallback, backgroundHandler);
} catch (Exception e) {
Log.e(TAG, "Error during focus unlocking");
}
}
private boolean sendRepeatPreviewRequest() {
try {
CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(mPreviewSurface);
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode.switchToCamera2FocusMode());
mCaptureSession.setRepeatingRequest(builder.build(), mPreCaptureCallback, mBackgroundHandler);
return true;
} catch (CameraAccessException e) {
e.printStackTrace();
return false;
}
}
/**
* Construct a new {@link Builder} to generate {@link RequestHolder} objects.
*
* @param requestId the ID to set in {@link RequestHolder} objects.
* @param subsequenceId the sequence ID to set in {@link RequestHolder} objects.
* @param request the original {@link CaptureRequest} to set in {@link RequestHolder}
* objects.
* @param repeating {@code true} if the request is repeating.
*/
public Builder(int requestId, int subsequenceId, CaptureRequest request,
boolean repeating, Collection<Long> jpegSurfaceIds) {
checkNotNull(request, "request must not be null");
mRequestId = requestId;
mSubsequenceId = subsequenceId;
mRequest = request;
mRepeating = repeating;
mJpegSurfaceIds = jpegSurfaceIds;
mNumJpegTargets = numJpegTargets(mRequest);
mNumPreviewTargets = numPreviewTargets(mRequest);
}
private static String getAvailableOisDataModes(int availableOisDataModes) {
switch (availableOisDataModes) {
case CaptureRequest.STATISTICS_OIS_DATA_MODE_ON:
return "ON";
case CaptureRequest.STATISTICS_OIS_DATA_MODE_OFF:
return "OFF";
default:
return UNKNOWN + "-" + availableOisDataModes;
}
}
/**
* Create a new legacy request; the parameters are copied.
*
* @param characteristics immutable static camera characteristics for this camera
* @param captureRequest immutable user-defined capture request
* @param previewSize immutable internal preview size used for {@link Camera#setPreviewSurface}
* @param parameters the initial camera1 parameter state; (copied) can be mutated
*/
public LegacyRequest(CameraCharacteristics characteristics, CaptureRequest captureRequest,
Size previewSize, Camera.Parameters parameters) {
this.characteristics = checkNotNull(characteristics, "characteristics must not be null");
this.captureRequest = checkNotNull(captureRequest, "captureRequest must not be null");
this.previewSize = checkNotNull(previewSize, "previewSize must not be null");
checkNotNull(parameters, "parameters must not be null");
this.parameters = Camera.getParametersCopy(parameters);
}
private void reconfigureCamera() {
if(mCamera != null) {
try {
mCaptureSession.stopRepeating();
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
mCaptureSession.capture(mPreviewBuilder.build(), mPreCaptureCallback, mHandler);
doPreviewConfiguration();
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
@Override
public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request,
long timestamp, long frameNumber)
{
mCallback.onCaptureStarted(AndroidCameraCaptureSessionProxy.this, request, timestamp,
frameNumber);
}
/**
* Return the value set by the key, or the {@code defaultValue} if no value was set.
*
* @throws NullPointerException if any of the args were {@code null}
*/
public static <T> T getOrDefault(CaptureRequest r, CaptureRequest.Key<T> key, T defaultValue) {
checkNotNull(r, "r must not be null");
checkNotNull(key, "key must not be null");
checkNotNull(defaultValue, "defaultValue must not be null");
T value = r.get(key);
if (value == null) {
return defaultValue;
} else {
return value;
}
}
/**
* カメラのライトをONにする.
*
* @param listener 実際にライトがONになったタイミングで実行されるリスナー
* @param handler リスナーを実行するハンドラー. リスナーを指定する場合は必須
* @throws CameraWrapperException カメラに何らかの致命的なエラーが発生した場合
*/
public synchronized void turnOnTorch(final @Nullable TorchOnListener listener,
final @Nullable Handler handler) throws CameraWrapperException {
if (listener != null && handler == null) {
throw new IllegalArgumentException("handler is mandatory if listener is specified.");
}
if (mIsTouchOn) {
notifyTorchOnEvent(listener, handler);
return;
}
try {
CameraDevice cameraDevice = openCamera();
mCaptureSession = createCaptureSession(cameraDevice);
final CaptureRequest.Builder requestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
if (mIsPreview) {
if (mPreviewSurface != null) {
requestBuilder.addTarget(mPreviewSurface);
}
if (mTargetSurface != null) {
requestBuilder.addTarget(mTargetSurface);
}
}
if (mIsRecording) {
requestBuilder.addTarget(mRecordingSurface);
}
if (!mIsPreview && !mIsRecording) {
requestBuilder.addTarget(mDummyPreviewReader.getSurface());
}
requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
mCaptureSession.setRepeatingRequest(requestBuilder.build(), null, mBackgroundHandler);
mUseTouch = true;
mIsTouchOn = true;
notifyTorchOnEvent(listener, handler);
} catch (CameraAccessException e) {
throw new CameraWrapperException(e);
}
}
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
Face[] faces = result.get(CaptureResult.STATISTICS_FACES);
if (faceDetectorCallback != null) {
faceDetectorCallback.onGetFaces(faces);
}
}
@Override
public void onCaptureResult(CaptureResult result, boolean isCompleted) {
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (DEBUG) {
Log.d(TAG, "aeState: " + Camera2Helper.debugAEState(aeState) + " isCompleted: " + isCompleted);
}
boolean isAeReady = aeState == null
|| aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED
|| aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED;
boolean timeout = (System.currentTimeMillis() - mStartTime) > 5000;
if (isAeReady || timeout) {
nextState(mTakePictureState);
}
}
private void captureStillPicture() {
MLog.d(TAG, "captureStillPicture");
try {
if (null == mCameraDevice) {
return;
}
// This is the CaptureRequest.Builder that we use to take a picture.
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());
// Use the same AE and AF modes as the preview.
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// setAutoFlash(captureBuilder);
// Orientation
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 0);
CameraCaptureSession.CaptureCallback CaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
Log.d(TAG, "saved to: "); // + mFile.toString());
unlockFocus();
}
};
mCaptureSession.stopRepeating();
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void triggerFocusArea(float x, float y) {
CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
try {
CameraCharacteristics characteristics
= manager.getCameraCharacteristics(mCameraId);
Integer sensorOrientation = characteristics.get(
CameraCharacteristics.SENSOR_ORIENTATION);
sensorOrientation = sensorOrientation == null ? 0 : sensorOrientation;
Rect cropRegion = AutoFocusHelper.cropRegionForZoom(characteristics, 1f);
mAERegions = AutoFocusHelper.aeRegionsForNormalizedCoord(x, y, cropRegion, sensorOrientation);
mAFRegions = AutoFocusHelper.afRegionsForNormalizedCoord(x, y, cropRegion, sensorOrientation);
// Step 1: Request single frame CONTROL_AF_TRIGGER_START.
CaptureRequest.Builder builder;
builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(mPreviewSurface);
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
mControlAFMode = AutoFocusMode.AUTO;
builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode.switchToCamera2FocusMode());
builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
mCaptureSession.capture(builder.build(), mPreCaptureCallback, mBackgroundHandler);
// Step 2: Call repeatingPreview to update mControlAFMode.
sendRepeatPreviewRequest();
resumeContinuousAFAfterDelay(DELAY_TIME_RESUME_CONTINUOUS_AF);
} catch (CameraAccessException ex) {
Log.e(TAG, "Could not execute preview request.", ex);
}
}
/**
* Run the precapture sequence for capturing a still image. This method should be called when
* we get a response in {@link #mCaptureCallback} from {@link #lockFocus()}.
*/
private void runPrecaptureSequence() {
try {
// This is how to tell the camera to trigger.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
// Tell #mCaptureCallback to wait for the precapture sequence to be set.
mState = STATE_WAITING_PRECAPTURE;
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void updateAutoFocus() {
if (mConfig.isAutoFocus()) {
CameraView.MODE mode = mConfig.getMode();
if (mode == CameraView.MODE.PICTURE) {
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
} else if (mode == CameraView.MODE.VIDEO) {
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);
}
} else {
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_MACRO);
}
}
/**
* Run the precapture sequence for capturing a still image. This method should be called when
* we get a response in {@link #mCaptureCallback} from {@link #lockFocus()}.
*/
private void runPrecaptureSequence() {
try {
// This is how to tell the camera to trigger.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
// Tell #mCaptureCallback to wait for the precapture sequence to be set.
mState = STATE_WAITING_PRECAPTURE;
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void takePhoto(boolean isFront, int degree, PhotoTakenCallback callback) {
mIsFront = isFront;
mDegree = degree;
mPhotoTakenCallback = callback;
CaptureRequest.Builder captureRequestBuilder;
try {
captureRequestBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
// 将ImageReader的surface作为CaptureRequest.Builder的目标
captureRequestBuilder.addTarget(mImageReader.getSurface());
// 自动对焦
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 自动曝光
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// 设置照片方向
if (mIsFront) {
captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, 270);
} else {
captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90);
}
// 拍照
CaptureRequest captureRequest = captureRequestBuilder.build();
mCameraCaptureSession.capture(captureRequest, null, mPreviewHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}