void BindScan(ProcessCameraProvider cameraProvider, int width, int height) { var preview = new Preview.Builder().Build(); // 绑定预览 preview.SetSurfaceProvider(binding !.previewView.SurfaceProvider); // 使用后置相机 var cameraSelector = new CameraSelector.Builder() .RequireLensFacing(CameraSelector.LensFacingBack) .Build(); // 绑定图片扫描解析 var imageAnalysis = new ImageAnalysis.Builder() .SetTargetResolution(new(width, height)) .SetBackpressureStrategy(ImageAnalysis.StrategyKeepOnlyLatest) .Build(); // 绑定图片扫描解析 analyser = new((barCodes, imageWidth, imageHeight) => { // 解绑当前所有相机操作 cameraProvider.UnbindAll(); ScanCompletedHandler?.Invoke(barCodes.Select(x => x.GetRawBytes())); ScanCompletedHandler = null; Finish(); }); imageAnalysis.SetAnalyzer(Executors.NewSingleThreadExecutor(), analyser); camera = cameraProvider.BindToLifecycle(this, cameraSelector, imageAnalysis, preview); }
private void FindAndOpenCamera() { bool cameraPermissions = CheckCameraPermissions(); if (!cameraPermissions) { return; } string errorMessage = "Unknown error"; bool foundCamera = false; IListenableFuture cameraProviderFuture = ProcessCameraProvider.GetInstance(this); cameraProviderFuture.AddListener(new Runnable(() => { // Camera provider is now guaranteed to be available mCameraProvider = cameraProviderFuture.Get() as ProcessCameraProvider; try { // Find first back-facing camera that has necessary capability. CameraSelector cameraSelector = new CameraSelector.Builder().RequireLensFacing((int)mLensFacing).Build(); // Find a good size for output - largest 4:3 aspect ratio that's less than 720p Preview.Builder previewBuilder = new Preview.Builder() .SetTargetAspectRatio(AspectRatio.Ratio43); Camera2Interop.Extender previewExtender = new Camera2Interop.Extender(previewBuilder); previewExtender.SetSessionCaptureCallback(mCaptureCallback); Preview preview = previewBuilder.Build(); // Must unbind the use-cases before rebinding them mCameraProvider.UnbindAll(); ICamera camera = mCameraProvider.BindToLifecycle( this as ILifecycleOwner, cameraSelector, preview); if (camera != null) { // Found suitable camera - get info, open, and set up outputs mCameraInfo = camera.CameraInfo; mCameraControl = camera.CameraControl; preview.SetSurfaceProvider(this); foundCamera = true; } if (!foundCamera) { errorMessage = GetString(Resource.String.camera_no_good); } SwitchRenderMode(0); } catch (CameraAccessException e) { errorMessage = GetErrorString(e); } if (!foundCamera) { ShowErrorDialog(errorMessage); } }), ContextCompat.GetMainExecutor(this)); }
/// <summary> /// https://codelabs.developers.google.com/codelabs/camerax-getting-started#3 /// </summary> private void StartCamera() { var cameraProviderFuture = ProcessCameraProvider.GetInstance(this); cameraProviderFuture.AddListener(new Runnable(() => { // Used to bind the lifecycle of cameras to the lifecycle owner var cameraProvider = (ProcessCameraProvider)cameraProviderFuture.Get(); // Preview var preview = new Preview.Builder().Build(); preview.SetSurfaceProvider(viewFinder.CreateSurfaceProvider()); // Take Photo this.imageCapture = new ImageCapture.Builder().Build(); // Frame by frame analyze var imageAnalyzer = new ImageAnalysis.Builder().Build(); imageAnalyzer.SetAnalyzer(cameraExecutor, new LuminosityAnalyzer(luma => Log.Debug(TAG, $"Average luminosity: {luma}") )); // Select back camera as a default, or front camera otherwise CameraSelector cameraSelector = null; if (cameraProvider.HasCamera(CameraSelector.DefaultBackCamera) == true) { cameraSelector = CameraSelector.DefaultBackCamera; } else if (cameraProvider.HasCamera(CameraSelector.DefaultFrontCamera) == true) { cameraSelector = CameraSelector.DefaultFrontCamera; } else { throw new System.Exception("Camera not found"); } try { // Unbind use cases before rebinding cameraProvider.UnbindAll(); // Bind use cases to camera cameraProvider.BindToLifecycle(this, cameraSelector, preview, imageCapture, imageAnalyzer); } catch (Exception exc) { Log.Debug(TAG, "Use case binding failed", exc); Toast.MakeText(this, $"Use case binding failed: {exc.Message}", ToastLength.Short).Show(); } }), ContextCompat.GetMainExecutor(this)); //GetMainExecutor: returns an Executor that runs on the main thread. }
/// <summary> /// 初始化并绑定摄像头 /// </summary> /// <param name="lifecycleOwner"></param> public void InitAndStartCamera(ILifecycleOwner lifecycleOwner, Action <bool, string> InitCallBack) { var cameraProviderFuture = ProcessCameraProvider.GetInstance(this.Context); cameraExecutor = Executors.NewSingleThreadExecutor(); cameraProviderFuture.AddListener(new Java.Lang.Runnable(() => { // Used to bind the lifecycle of cameras to the lifecycle owner var cameraProvider = (ProcessCameraProvider)cameraProviderFuture.Get(); // Preview var preview = new Preview.Builder() .Build(); preview.SetSurfaceProvider(_CameraPreView.SurfaceProvider); // Take Photo this._ImageCapture = new ImageCapture.Builder() .SetTargetResolution(new Size(CaptureImageSize_Width, CaptureImageSize_Height)) .Build(); // Frame by frame analyze(Not Use Now) var imageAnalyzer = new ImageAnalysis.Builder().Build(); imageAnalysisFrameProcess = new ImageAnalysisFrameProcess(); imageAnalyzer.SetAnalyzer(cameraExecutor, imageAnalysisFrameProcess); //imageAnalyzer.SetAnalyzer(cameraExecutor, new LuminosityAnalyzer(luma => // Log.Debug("", $"Average luminosity: {luma}") // )); #region Select back camera as a default, or front camera otherwise CameraSelector cameraSelector = null; //if (cameraProvider.HasCamera(CameraSelector.DefaultBackCamera) == true) // cameraSelector = CameraSelector.DefaultBackCamera; //else if (cameraProvider.HasCamera(CameraSelector.DefaultFrontCamera) == true) // cameraSelector = CameraSelector.DefaultFrontCamera; //else // throw new System.Exception("Camera not found"); switch (CameraFacing) { case CameraFacing.Back: if (cameraProvider.HasCamera(CameraSelector.DefaultBackCamera) == true) { cameraSelector = CameraSelector.DefaultBackCamera; } else { if (cameraProvider.HasCamera(CameraSelector.DefaultFrontCamera) == true) { cameraSelector = CameraSelector.DefaultFrontCamera; } else { InitCallBack?.Invoke(false, "Not found any camera device"); return; } } break; case CameraFacing.Front: { if (cameraProvider.HasCamera(CameraSelector.DefaultFrontCamera) == true) { cameraSelector = CameraSelector.DefaultFrontCamera; } else { if (cameraProvider.HasCamera(CameraSelector.DefaultBackCamera) == true) { cameraSelector = CameraSelector.DefaultBackCamera; } else { InitCallBack?.Invoke(false, "Not found any camera device"); return; } } } break; } #endregion try { // Unbind use cases before rebinding cameraProvider.UnbindAll(); // Bind use cases to camera var camera = cameraProvider.BindToLifecycle(lifecycleOwner, cameraSelector, preview, _ImageCapture, imageAnalyzer); _CameraController = camera.CameraControl; _CameraInfo = camera.CameraInfo; InitCallBack?.Invoke(true, ""); } catch (Exception exc) { Toast.MakeText(this.Context, $"Use case binding failed: {exc.Message}", ToastLength.Short).Show(); } }), AndroidX.Core.Content.ContextCompat.GetMainExecutor(this.Context)); }