Advanced Camera Functionality
In this guide, you will learn about advanced camera functionality not explained in the “Getting Started” guides.
Before you start…
To get the most out of this guide, we recommend that you first take a look at the following guides:
One of the “Getting Started” guides for barcode capture
The data capture context supports using different frame sources to perform recognition on. Most applications will use the built-in camera of the device, e.g. the world-facing camera of a device. The remainder of this guide will assume that you use the built-in camera.
Switching between World-Facing and User-Facing
In your app you might want to switch between using the world-facing and user-facing camera for different use cases. As these are different cameras entirely switching between them is done by instantiating an entirely new camera and setting it as the data capture context’s new frame source.
Let’s start with the world facing camera. What we do is very similar to the camera section in the “Getting Started” guides, but here we want to specifically use the world-facing camera. Remember to use the recommended camera settings for whichever data capture mode you are using.
const cameraSettings = ...;
const worldFacingCamera = ScanditCore.Camera.atPosition(ScanditCore.CameraPosition.WorldFacing);
worldFacingCamera.applySettings(cameraSettings);
// Set the camera as the frame source and turn it on.
context.setFrameSource(worldFacingCamera);
worldFacingCamera.switchToDesiredState(ScanditCore.FrameSourceState.On);
At this point we have a running world-facing camera that is used by the context. Whenever we want to switch to a user-facing camera, we simply turn off the world-facing camera and create a new user-facing camera that we set as the new frame source.
worldFacingCamera.switchToDesiredState(ScanditCore.FrameSourceState.Off);
const userFacingCamera = ScanditCore.Camera.atPosition(ScanditCore.CameraPosition.UserFacing);
if (userFacingCamera != null) {
userFacingCamera.applySettings(cameraSettings);
// Set the camera as the frame source and turn it on.
context.setFrameSource(userFacingCamera);
userFacingCamera.switchToDesiredState(ScanditCore.FrameSourceState.On);
}
Using the Standby State
The camera has three different states: Off, On and Standby.
Depending on the device, the transition between Standby and On can be up to 90% faster (up to 50% faster on Android devices) than the transition between Off and On. We strongly recommend using Standby when the user is likely to be scanning in quick succession. This will minimize delays when starting the camera. Battery usage when the camera is in Standby is slightly higher than when it is in Off (especially on iOS devices). However, this is more than offset by the fact that total scanning time is reduced. This means that in the vast majority of cases there is no overall impact on battery life.
Because of this, it is important to be selective about the usage of the standby state and avoid keeping the camera in standby throughout the entire app. To minimize the additional battery usage it is better to go into standby only on certain screens where repeated scanning is expected. In rare cases where the entire app does repeated scanning, keeping the camera in standby throughout the entire app might be worth the additional battery usage.
App Flow with Standby State
When using the standby state the typical app flow will be along the following lines:
Move to a screen in the app that has scanning capabilities
Change the camera’s state to Standby
Repeatedly change to On and back to Standby as the user starts and stops scanning
Move away from the screen and change the camera state back to Off
For apps that are fully centered around scanning it might be a better option to stay in standby throughout at the cost of the slight battery usage increase:
Setting the Standby State
Setting the standby state is very straight forward and works just like any other settable FrameSourceState:
camera.switchToDesiredState(ScanditCore.FrameSourceState.Standby);
// Time passes until the scanner should become active
camera.switchToDesiredState(ScanditCore.FrameSourceState.On);
// After scanning the camera can go to standby again
camera.switchToDesiredState(ScanditCore.FrameSourceState.Standby);