public class Camera2CaptureCallbackForwarder extends CameraCaptureSession.CaptureCallback
CameraCaptureSession.CaptureCallback
, invoking
its callbacks on a separate Handler
.NO_FRAMES_CAPTURED
Constructor and Description |
---|
Camera2CaptureCallbackForwarder(CameraCaptureSession.CaptureCallback listener,
Handler handler) |
Modifier and Type | Method and Description |
---|---|
void |
onCaptureCompleted(CameraCaptureSession session,
CaptureRequest request,
TotalCaptureResult result)
This method is called when an image capture has fully completed and all the
result metadata is available.
|
void |
onCaptureFailed(CameraCaptureSession session,
CaptureRequest request,
CaptureFailure failure)
This method is called instead of
CameraCaptureSession.CaptureCallback.onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult) when the
camera device failed to produce a CaptureResult for the
request. |
void |
onCaptureProgressed(CameraCaptureSession session,
CaptureRequest request,
CaptureResult partialResult)
This method is called when an image capture makes partial forward progress; some
(but not all) results from an image capture are available.
|
void |
onCaptureSequenceAborted(CameraCaptureSession session,
int sequenceId)
This method is called independently of the others in CaptureCallback,
when a capture sequence aborts before any
CaptureResult
or CaptureFailure for it have been returned via this listener. |
void |
onCaptureSequenceCompleted(CameraCaptureSession session,
int sequenceId,
long frameNumber)
This method is called independently of the others in CaptureCallback,
when a capture sequence finishes and all
CaptureResult
or CaptureFailure for it have been returned via this listener. |
void |
onCaptureStarted(CameraCaptureSession session,
CaptureRequest request,
long timestamp,
long frameNumber)
This method is called when the camera device has started capturing
the output image for the request, at the beginning of image exposure, or
when the camera device has started processing an input image for a reprocess
request.
|
onCaptureBufferLost, onCapturePartial, onCaptureStarted
public Camera2CaptureCallbackForwarder(CameraCaptureSession.CaptureCallback listener, Handler handler)
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result)
CameraCaptureSession.CaptureCallback
This callback will always fire after the last CameraCaptureSession.CaptureCallback.onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult)
;
in other words, no more partial results will be delivered once the completed result
is available.
For performance-intensive use-cases where latency is a factor, consider
using CameraCaptureSession.CaptureCallback.onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult)
instead.
The default implementation of this method does nothing.
onCaptureCompleted
in class CameraCaptureSession.CaptureCallback
session
- the session returned by CameraDevice.createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler)
request
- The request that was given to the CameraDeviceresult
- The total output metadata from the capture, including the
final capture parameters and the state of the camera system during
capture.CameraCaptureSession.capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.captureBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.setRepeatingRequest(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
public void onCaptureFailed(CameraCaptureSession session, CaptureRequest request, CaptureFailure failure)
CameraCaptureSession.CaptureCallback
CameraCaptureSession.CaptureCallback.onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult)
when the
camera device failed to produce a CaptureResult
for the
request.
Other requests are unaffected, and some or all image buffers from the capture may have been pushed to their respective output streams.
The default implementation of this method does nothing.
onCaptureFailed
in class CameraCaptureSession.CaptureCallback
session
- The session returned by CameraDevice.createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler)
request
- The request that was given to the CameraDevicefailure
- The output failure from the capture, including the failure reason
and the frame number.CameraCaptureSession.capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.captureBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.setRepeatingRequest(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult)
CameraCaptureSession.CaptureCallback
The result provided here will contain some subset of the fields of
a full result. Multiple CameraCaptureSession.CaptureCallback.onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult)
calls may happen per
capture; a given result field will only be present in one partial
capture at most. The final CameraCaptureSession.CaptureCallback.onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult)
call will always
contain all the fields (in particular, the union of all the fields of all
the partial results composing the total result).
For each request, some result data might be available earlier than others. The typical delay between each partial result (per request) is a single frame interval. For performance-oriented use-cases, applications should query the metadata they need to make forward progress from the partial results and avoid waiting for the completed result.
For a particular request, CameraCaptureSession.CaptureCallback.onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult)
may happen before or after
CameraCaptureSession.CaptureCallback.onCaptureStarted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, long, long)
.
Each request will generate at least 1
partial results, and at most
CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT
partial results.
Depending on the request settings, the number of partial results per request will vary, although typically the partial count could be the same as long as the camera device subsystems enabled stay the same.
The default implementation of this method does nothing.
onCaptureProgressed
in class CameraCaptureSession.CaptureCallback
session
- the session returned by CameraDevice.createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler)
request
- The request that was given to the CameraDevicepartialResult
- The partial output metadata from the capture, which
includes a subset of the TotalCaptureResult
fields.CameraCaptureSession.capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.captureBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.setRepeatingRequest(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
,
CameraCaptureSession.setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
public void onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId)
CameraCaptureSession.CaptureCallback
CaptureResult
or CaptureFailure
for it have been returned via this listener.
Due to the asynchronous nature of the camera device, not all submitted captures
are immediately processed. It is possible to clear out the pending requests
by a variety of operations such as CameraCaptureSession.stopRepeating()
or
CameraCaptureSession.abortCaptures()
. When such an event happens,
CameraCaptureSession.CaptureCallback.onCaptureSequenceCompleted(android.hardware.camera2.CameraCaptureSession, int, long)
will not be called.
The default implementation does nothing.
onCaptureSequenceAborted
in class CameraCaptureSession.CaptureCallback
session
- The session returned by CameraDevice.createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler)
sequenceId
- A sequence ID returned by the CameraCaptureSession.capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
family of functions.CaptureResult.getFrameNumber()
,
CaptureFailure.getFrameNumber()
,
CaptureResult.getSequenceId()
,
CaptureFailure.getSequenceId()
,
CameraCaptureSession.CaptureCallback.onCaptureSequenceCompleted(android.hardware.camera2.CameraCaptureSession, int, long)
public void onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber)
CameraCaptureSession.CaptureCallback
CaptureResult
or CaptureFailure
for it have been returned via this listener.
In total, there will be at least one result/failure returned by this listener
before this callback is invoked. If the capture sequence is aborted before any
requests have been processed, CameraCaptureSession.CaptureCallback.onCaptureSequenceAborted(android.hardware.camera2.CameraCaptureSession, int)
is invoked instead.
The default implementation does nothing.
onCaptureSequenceCompleted
in class CameraCaptureSession.CaptureCallback
session
- The session returned by CameraDevice.createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler)
sequenceId
- A sequence ID returned by the CameraCaptureSession.capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler)
family of functions.frameNumber
- The last frame number (returned by CaptureResult.getFrameNumber()
or CaptureFailure.getFrameNumber()
) in the capture sequence.CaptureResult.getFrameNumber()
,
CaptureFailure.getFrameNumber()
,
CaptureResult.getSequenceId()
,
CaptureFailure.getSequenceId()
,
CameraCaptureSession.CaptureCallback.onCaptureSequenceAborted(android.hardware.camera2.CameraCaptureSession, int)
public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber)
CameraCaptureSession.CaptureCallback
For a regular capture request, this callback is invoked right as the capture of a frame begins, so it is the most appropriate time for playing a shutter sound, or triggering UI indicators of capture.
The request that is being used for this capture is provided, along
with the actual timestamp for the start of exposure. For a reprocess
request, this timestamp will be the input image's start of exposure
which matches the result timestamp field
of the TotalCaptureResult
that was used to
create the reprocess request
.
This timestamp matches the timestamps that will be
included in the result timestamp field
,
and in the buffers sent to each output Surface. These buffer
timestamps are accessible through, for example,
Image.getTimestamp()
or
SurfaceTexture.getTimestamp()
.
The frame number included is equal to the frame number that will be included in
CaptureResult.getFrameNumber()
.
For the simplest way to play a shutter sound camera shutter or a
video recording start/stop sound, see the
MediaActionSound
class.
The default implementation of this method does nothing.
onCaptureStarted
in class CameraCaptureSession.CaptureCallback
session
- the session returned by CameraDevice.createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler)
request
- the request for the capture that just beguntimestamp
- the timestamp at start of capture for a regular request, or
the timestamp at the input image's start of capture for a
reprocess request, in nanoseconds.frameNumber
- the frame number for this captureMediaActionSound