// Initialize CameraX, and prepare to bind the camera use cases private void SetUpCamera() { var cameraProviderFuture = ProcessCameraProvider.GetInstance(RequireContext()); cameraProviderFuture.AddListener(new Java.Lang.Runnable(() => { // CameraProvider cameraProvider = cameraProviderFuture.Get() as ProcessCameraProvider;; // Select lensFacing depending on the available cameras if (HasBackCamera()) { lensFacing = CameraSelector.LensFacingBack; } else if (HasFrontCamera()) { lensFacing = CameraSelector.LensFacingFront; } else { throw new Java.Lang.IllegalStateException("Back and front camera are unavailable"); } // Enable or disable switching between cameras UpdateCameraSwitchButton(); // Build and bind the camera use cases BindCameraUseCases(); }), ContextCompat.GetMainExecutor(RequireContext())); }
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)); }
private void StartCamera() { var cameraProviderFuture = ProcessCameraProvider.GetInstance(this); cameraProviderFuture.AddListener(new Runnable(() => { _cameraProvider = (ProcessCameraProvider)cameraProviderFuture.Get(); _previewView.PostDelayed(BindCameraUseCases, 16); }), 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. }
protected override async void OnCreate2(Bundle?savedInstanceState) { base.OnCreate2(savedInstanceState); this.SetSupportActionBarWithNavigationClick(binding !.toolbar, true); R.Subscribe(() => { Title = AppResources.ScanQRCode; }).AddTo(this); binding.previewView.ViewTreeObserver !.AddOnGlobalLayoutListener(this); cameraProviderFuture = ProcessCameraProvider.GetInstance(this); var status = await IPermissions.Instance.CheckAndRequestAsync <Permissions.Camera>(); if (!status.IsOk()) { Finish(); } }
/// <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)); }