startCamera method

  1. @override
Future<int> startCamera({
  1. required CameraConfig cameraConfig,
  2. HandConfig? handConfig,
  3. FaceConfig? faceConfig,
})
override

Implementation

@override
Future<int> startCamera({
  required CameraConfig cameraConfig,
  HandConfig? handConfig,
  FaceConfig? faceConfig,
}) async {
  // Clamp to 1-60 if set, 0 means no throttle
  final maxResults = cameraConfig.maxResultsPerSecond <= 0
      ? 0
      : cameraConfig.maxResultsPerSecond.clamp(1, 60);

  final result = await _commandChannel.invokeMethod<int>('startCamera', {
    'cameraFacing': cameraConfig.facing.index,
    'resolution': cameraConfig.resolution.index,
    'maxResultsPerSecond': maxResults,
    'enableHand': handConfig != null,
    'enableFace': faceConfig != null,
    if (handConfig != null) ...{
      'maxHands': handConfig.maxHands,
      'minDetectionConfidence': handConfig.minDetectionConfidence,
      'minPresenceConfidence': handConfig.minPresenceConfidence,
      'minTrackingConfidence': handConfig.minTrackingConfidence,
      // Each custom gesture serializes its fingerStates in thumb→pinky order.
      'customGestures': handConfig.customGestures
          .map(
            (g) => {
              'name': g.name,
              'fingerStates': [
                _fingerStateToNative(g.fingerStates[Finger.thumb]),
                _fingerStateToNative(g.fingerStates[Finger.indexFinger]),
                _fingerStateToNative(g.fingerStates[Finger.middle]),
                _fingerStateToNative(g.fingerStates[Finger.ring]),
                _fingerStateToNative(g.fingerStates[Finger.pinky]),
              ],
            },
          )
          .toList(),
      ..._serializeGestureFilters(handConfig),
    },
    if (faceConfig != null) ...{
      'detectEmotion': faceConfig.detectEmotion,
      'detectLandmarks': faceConfig.detectLandmarks,
      'detectContours': faceConfig.detectContours,
      'minFaceSize': faceConfig.minFaceSize,
      'enableFaceTracking': faceConfig.enableTracking,
      'minEmotionConfidence': faceConfig.minEmotionConfidence,
      'accurateMode': faceConfig.accurateMode,
    },
  });
  // result! is safe: native always returns an int on success, throws on failure.
  return result!;
}