private void SetupCamera(bool restart = false) { try { if (_captureSession == null || restart) { _captureSession = new AVCaptureSession { SessionPreset = AVCaptureSession.PresetPhoto }; if (!_cameraModule.AvailableCameras.Any()) { var deviceTypes = new List <AVCaptureDeviceType> { AVCaptureDeviceType.BuiltInWideAngleCamera, AVCaptureDeviceType.BuiltInTelephotoCamera }; if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) { deviceTypes.Add(AVCaptureDeviceType.BuiltInUltraWideCamera); } var session = AVCaptureDeviceDiscoverySession.Create( deviceTypes.ToArray(), AVMediaType.Video, AVCaptureDevicePosition.Unspecified); _devices = session.Devices; foreach (var avCaptureDevice in _devices) { _cameraModule.AvailableCameras.Add(new AvailableCamera { DisplayName = avCaptureDevice.LocalizedName, CameraId = avCaptureDevice.UniqueID, IsFront = avCaptureDevice.Position == AVCaptureDevicePosition.Front }); } } } SetPreviewOrientation(); if (_device == null) { _device = AVCaptureDevice.GetDefaultDevice(AVMediaTypes.Video); _cameraModule.ChosenCamera = _cameraModule.AvailableCameras.First(c => c.CameraId == _device.UniqueID); } else { _device = AVCaptureDevice.DeviceWithUniqueID(_cameraModule.ChosenCamera.CameraId); } SetPreviewSizing(_device, restart); TurnOffFlashAndSetContinuousAutoMode(_device); _is10OrHigher = UIDevice.CurrentDevice.CheckSystemVersion(10, 0); var isRestart = false; if (_is10OrHigher && (_photoOutput == null || restart)) { _photoOutput = new AVCapturePhotoOutput { IsHighResolutionCaptureEnabled = true }; _captureSession.AddOutput(_photoOutput); isRestart = true; } else if (!_is10OrHigher && (_stillImageOutput == null || restart)) { _stillImageOutput = new AVCaptureStillImageOutput { OutputSettings = new NSDictionary(), HighResolutionStillImageOutputEnabled = true }; _captureSession.AddOutput(_stillImageOutput); isRestart = true; } if (isRestart) { var settings = new AVVideoSettingsUncompressed { PixelFormatType = CVPixelFormatType.CV32BGRA }; _previewFrameOutput = new AVCaptureVideoDataOutput { AlwaysDiscardsLateVideoFrames = true, MinFrameDuration = new CMTime(1, 30), UncompressedVideoSetting = settings }; //if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) //TODO: what is this? //{ // _previewFrameOutput.DeliversPreviewSizedOutputBuffers = true; // _previewFrameOutput.AutomaticallyConfiguresOutputBufferDimensions = false; //} _previewFrameDelegate = new PreviewFrameDelegate(_cameraModule); var queue = new DispatchQueue("PreviewFrameQueue"); _previewFrameOutput.WeakVideoSettings = settings.Dictionary; _previewFrameOutput.SetSampleBufferDelegate(_previewFrameDelegate, queue); _captureSession.AddOutput(_previewFrameOutput); _captureSession.AddInput(AVCaptureDeviceInput.FromDevice(_device)); } _device.AddObserver(this, "adjustingFocus", NSKeyValueObservingOptions.OldNew, IntPtr.Zero); } catch (Exception e) { _cameraModule.ErrorMessage = e.ToString(); } }