How iCamera manages Camera1 and Camera2 via Strategy Pattern
masteriCamera uses a combination of the Facade and Strategy design patterns to abstract the differences between the legacy Camera1 API and the modern Camera2 API.
- Facade: The
CameraManagerinterface provides a unified set of methods (e.g., switching cameras, toggling flash, zooming, taking photos) so the consumer doesn't need to know which underlying API is being used. - Strategy: The library uses a
CameraManagerCreatorto decide at runtime whether to instantiate aCamera2Manageror aCamera1Managerbased on device support and OS version.
By default, CameraManagerCreatorImpl checks if the device supports Camera2 via CameraHelper.hasCamera2(context). If it fails or is unsupported, it falls back to Camera1Manager.
// The strategy interface for creating a manager
public interface CameraManagerCreator {
CameraManager create(Context context, CameraPreview cameraPreview);
}
// The default implementation that handles Camera1/Camera2 fallback
public class CameraManagerCreatorImpl implements CameraManagerCreator {
@Override
public CameraManager create(Context context, CameraPreview cameraPreview) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && CameraHelper.hasCamera2(context)) {
return new Camera2Manager(cameraPreview);
}
return new Camera1Manager(cameraPreview);
}
}