SurfaceRequest
class SurfaceRequest
A completable, single-use request of a Surface.
Contains requirements for surface characteristics along with methods for completing the request and listening for request cancellation.
Acts as a bridge between the surface provider and the surface requester. The diagram below describes how it works:
- The surface provider gives a reference to surface requester for providing
Surface(e.g.setSurfaceProvider). - The surface requester uses the reference to send a
SurfaceRequestto get aSurface(e.g.onSurfaceRequested). - The surface provider can use
provideSurfaceto provide aSurfaceor inform the surface requester noSurfacewill be provided withwillNotProvideSurface. If aSurfaceis provided, the connection between surface provider and surface requester is established. - If the connection is established, the surface requester can get the
SurfacethroughgetDeferrableSurfaceand start to send frame data. - If for some reason the provided
Surfaceis no longer valid (e.g. when the SurfaceView destroys its surface due to page being slid out in ViewPager2), the surface provider can useinvalidatemethod to inform the surface requester and the established connection will be closed. - The surface requester will re-send a new
SurfaceRequestto establish a new connection.
Summary
Nested types |
|---|
@AutoValueResult of providing a surface to a |
@AutoValueTransformation associated the preview output. |
|
Listener that receives updates of the |
Public functions |
|
|---|---|
Unit |
addRequestCancellationListener(executor: Executor, listener: Runnable)Adds a listener to be informed when the camera cancels the surface request. |
Unit |
Clears the |
DynamicRange |
Returns the dynamic range expected to be used with the requested surface. |
Size |
Returns the resolution of the requested |
Boolean |
Invalidates the previously provided |
Unit |
provideSurface(Completes the request for a |
Unit |
setTransformationInfoListener(Sets a listener to receive updates on transformation info. |
Boolean |
Signals that the request will never be fulfilled. |
Public functions
addRequestCancellationListener
fun addRequestCancellationListener(executor: Executor, listener: Runnable): Unit
Adds a listener to be informed when the camera cancels the surface request.
A surface request may be cancelled by the camera if the surface is no longer required. Examples of why cancellation may occur include (1) a UseCase being unbound from the camera, (2) surface requirements, such as resolution, changing due to newly bound use cases, or (3) the camera requiring a new Surface object on lower API levels to work around compatibility issues.
When a request is cancelled, the Runnables provided here will be invoked on the Executor they are added with, and can be used as a signal to stop any work that may be in progress to fulfill the surface request.
Once a surface request has been cancelled by the camera, willNotProvideSurface will have no effect and will return false. Attempting to complete the request via provideSurface will also have no effect, and any resultListener passed to provideSurface will be invoked with a Result containing RESULT_REQUEST_CANCELLED.
Note that due to the asynchronous nature of this listener, it is not guaranteed that the listener will be called before an attempt to complete the request with provideSurface or willNotProvideSurface, so the return values of these methods can always be checked if your workflow for producing a surface expects them to complete successfully.
clearTransformationInfoListener
fun clearTransformationInfoListener(): Unit
Clears the TransformationInfoListener set via setTransformationInfoListener.
getDynamicRange
fun getDynamicRange(): DynamicRange
Returns the dynamic range expected to be used with the requested surface.
The dynamic range may have implications for which surface type is returned. Special care should be taken to ensure the provided surface can support the requested dynamic range. For example, if the returned dynamic range has getBitDepth equal to BIT_DEPTH_10_BIT, then the surface provided to provideSurface should use an android.graphics.ImageFormat that can support ten bits of dynamic range, such as PRIVATE or YCBCR_P010.
The dynamic range returned here will always be fully specified. That is, it will never have an encoding of ENCODING_UNSPECIFIED or ENCODING_HDR_UNSPECIFIED and will never have bit depth of BIT_DEPTH_UNSPECIFIED.
getResolution
fun getResolution(): Size
Returns the resolution of the requested Surface.
The surface which fulfills this request must have the resolution specified here in order to fulfill the resource requirements of the camera. Fulfillment of the request with a surface of a different resolution may cause the resultListener passed to provideSurface to be invoked with a Result containing RESULT_INVALID_SURFACE.
| Returns | |
|---|---|
Size |
The guaranteed supported resolution. |
| See also | |
|---|---|
setDefaultBufferSize |
invalidate
fun invalidate(): Boolean
Invalidates the previously provided Surface to provide a new Surface.
Call this method to inform the surface requester that the previously provided Surface is no longer valid (e.g. when the SurfaceView destroys its surface due to page being slid out in ViewPager2) and should re-send a SurfaceRequest to obtain a new Surface.
Calling this method will cause the camera to be reconfigured. The app should call this method when the surface provider is ready to provide a new Surface. (e.g. a SurfaceView's surface is created when its window is visible.)
If the provided Surface was already invalidated, invoking this method will return false, and will have no effect. The surface requester will not be notified again, so there will not be another SurfaceRequest.
Calling this method without provideSurface (regardless of whether @link #willNotProvideSurface()} has been called) will still trigger the surface requester to re-send a SurfaceRequest.
Since calling this method also means that the SurfaceRequest will not be fulfilled, if the SurfaceRequest has not responded, it will respond as if calling willNotProvideSurface.
provideSurface
fun provideSurface(
surface: Surface,
executor: Executor,
resultListener: Consumer<SurfaceRequest.Result!>
): Unit
Completes the request for a Surface if it has not already been completed or cancelled.
Once the camera no longer needs the provided surface, the resultListener will be invoked with a Result containing RESULT_SURFACE_USED_SUCCESSFULLY. At this point it is safe to release the surface and any underlying resources. Releasing the surface before receiving this signal may cause undesired behavior on lower API levels.
If the request is cancelled by the camera before successfully attaching the provided surface to the camera, then the resultListener will be invoked with a Result containing RESULT_REQUEST_CANCELLED. In addition, any cancellation listeners provided to addRequestCancellationListener will be invoked.
If the request was previously completed via willNotProvideSurface, then resultListener will be invoked with a Result containing RESULT_WILL_NOT_PROVIDE_SURFACE.
Upon returning from this method, the surface request is guaranteed to be complete. However, only the resultListener provided to the first invocation of this method should be used to track when the provided Surface is no longer in use by the camera, as subsequent invocations will always invoke the resultListener with a Result containing RESULT_SURFACE_ALREADY_PROVIDED.
| Parameters | |
|---|---|
surface: Surface |
The surface which will complete the request. |
executor: Executor |
Executor used to execute the |
resultListener: Consumer<SurfaceRequest.Result!> |
Listener used to track how the surface is used by the camera in response to being provided by this method. |
setTransformationInfoListener
fun setTransformationInfoListener(
executor: Executor,
listener: SurfaceRequest.TransformationInfoListener
): Unit
Sets a listener to receive updates on transformation info.
Sets a listener to receive the transformation info associated with this SurfaceRequest when it changes or becomes available. The listener is called immediately if transformation info is available at the time of setting.
| Parameters | |
|---|---|
executor: Executor |
The executor used to notify the listener. |
listener: SurfaceRequest.TransformationInfoListener |
the listener which will be called when transformation info changes. |
willNotProvideSurface
fun willNotProvideSurface(): Boolean
Signals that the request will never be fulfilled.
This may be called in the case where the application may be shutting down and a surface will never be produced to fulfill the request.
This should always be called as soon as it is known that the request will not be fulfilled. Failure to complete the SurfaceRequest via willNotProvideSurface() or provideSurface may cause long delays in shutting down the camera.
Upon returning from this method, the request is guaranteed to be complete, regardless of the return value. If the request was previously successfully completed by provideSurface, invoking this method will return false, and will have no effect on how the surface is used by the camera.
| Returns | |
|---|---|
Boolean |
|