private async void CameraHelper_OnInitOver(ErrorMessageType obj) { await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { try { IsSetCamera = true; cbxCameraList.Items.Clear(); CameraInfo selectedCamera = null; foreach (var item in CameraHelper.CameraDevicesList) { cbxCameraList.Items.Add(item); if (CameraHelper.SelectedCameraId == item.Id) { selectedCamera = item; } } cbxCameraList.SelectedItem = selectedCamera; cbxSizeList.Items.Clear(); var sizeList = CameraHelper.GetSizeList(); CameraSizeInfo selectedItem = null; foreach (var item in sizeList) { cbxSizeList.Items.Add(item); if (item.Width == CameraHelper.CurrentPhotoW && item.Height == CameraHelper.CurrentPhotoH) { selectedItem = item; } } if (selectedItem == null && sizeList.Count > 0) { selectedItem = sizeList.First(li => li.SizeTag == sizeList.Max(li2 => li2.SizeTag)); } cbxSizeList.SelectedItem = selectedItem; sldZoom.Minimum = CameraHelper.MinZoomSetting; sldZoom.Maximum = CameraHelper.MaxZoomSetting; sldZoom.StepFrequency = CameraHelper.StepZoomSeting; sldZoom.IsEnabled = CameraHelper.IsSupportHWZoom == true; btnCaptureMorePhoto.IsEnabled = CameraHelper.IsSupportContinuousCapture == true; AutoFocus.IsChecked = CameraHelper.bFocus; AutoExposure.IsChecked = CameraHelper.bExposureAuto; AutoBacklightCompensation.IsChecked = CameraHelper.bBacklightCompensation; AutoWhiteBalance.IsChecked = CameraHelper.bWhiteBalance; } finally { IsSetCamera = false; BottomAppBar.IsEnabled = true; } }); }
/// <summary> /// 初始化摄像头并启动预览 /// </summary> public static async void InitCamera(bool isNewInit = true, bool isMinZoom = false) { try { AppPathHelper.Init(); ConfigHelper.Init(); if (isNewInit == true && IsLoading == true) { TriggerInitCameraOver(ErrorMessageType.Camera_Start_IsLoading); if (CameraLoadedEvent != null) { CameraLoadedEvent(); } return; } IsLoading = true; if (isNewInit == true) { FailedIndex = 1; IsZoomEffectAdded = false; } //使用UI线程进行初始化,因为需要一些事件中进行调用或重试,这些事件可能在子线程中。 await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { IsCanSetCamera = false; IsCanUseCamera = false; }); try { await StopPreview(); await LoadDevice(); if (CurrentCamDevice == null) { TriggerInitCameraOver(ErrorMessageType.Camera_Start_NoDevice); if (CameraLoadedEvent != null) { CameraLoadedEvent(); } return; } var useRes = IsCanUseCurrentDevice(); if (useRes != ErrorMessageType.None) { TriggerInitCameraOver(useRes); if (CameraLoadedEvent != null) { CameraLoadedEvent(); } return; } var res = await InitCamera(); if (!res) { TriggerInitCameraOver(ErrorMessageType.Camera_Start_UserDenied); if (CameraLoadedEvent != null) { CameraLoadedEvent(); } return; } if (isMinZoom) { AppHelper.CameraZoomNumber = MinZoomSetting; } SetZoom(AppHelper.CameraZoomNumber, true); GetPreviewSize(); GetPhotoSize(); if (CameraPhotoSizeList != null) { IsHavePhotoStream = CameraPhotoSizeList.Count > 0; } else { IsHavePhotoStream = false; } //获取录像分辨率,在摄像头初始化的时候判断是否支持两种录像的分辨率。 var recordSize = MainCamera.VideoDeviceController .GetAvailableMediaStreamProperties(MediaStreamType.VideoRecord) .Where(li => li is VideoEncodingProperties) .Select(li => li as VideoEncodingProperties); var cameraSize = CameraHelper.GetSizeList(); var oneRecordSize = RecordSizeList[0]; var twoRecordSize = RecordSizeList[1]; IsCanRecord = recordSize.Count(li => li.Width == oneRecordSize.Width && li.Height == oneRecordSize.Height) > 0 && cameraSize.Count(li => (li.Width == oneRecordSize.Width && li.Height == oneRecordSize.Height) || (li.Width == twoRecordSize.Width && li.Height == twoRecordSize.Height)) > 0; //设置分辨率 await SetSize(); MainCamera.Failed += async(ds, de) => { try { await StopPreview(); } catch (Exception ex) { } switch (de.Code) { case 0xC00D3EA3: case 0xC00D3704: TriggerInitCameraOver(ErrorMessageType.Camera_Start_AppLocked); break; case 0xC00D3E82: if (FailedIndex <= 2) { FailedIndex++; await Task.Delay(500); InitCamera(false); } else { TriggerInitCameraOver(ErrorMessageType.Camera_Start_AppLocked); } break; case 0x80070326: TriggerInitCameraOver(ErrorMessageType.Camera_Start_NoAccessRight); break; } }; if (OnNeedSetControls != null) { await OnNeedSetControls(MainCamera); } await MainCamera.StartPreviewAsync(); //await PrepareLowLagPhoto(); //调用结束事件 TriggerInitCameraOver(ErrorMessageType.None); } catch (Exception ex) { } } catch (Exception ex) { } finally { IsLoading = false; if (CameraLoadedEvent != null) { CameraLoadedEvent(); } } }