首页 > 解决方案 > Xamarin Camera2basic 无法在运行时设置 flash 参数

问题描述

我正在使用camera2basic,当我在运行时更改flash参数时它不起作用并在应用程序加载时加载第一个参数。

示例:当我在硬代码中设置自动闪光时,当我在我的应用程序中将其更改为关闭时,它不起作用并且闪光参数是自动闪光。

我想在应用程序中设置 flash 参数而不是硬编码。我该怎么做?

        **//Camera2BasicFragment.cs**
        public void CaptureStillPicture()
        {
            try
            {
                var activity = Activity;
                if (null == activity || null == mCameraDevice)
                {
                    return;
                }
                // This is the CaptureRequest.Builder that we use to take a picture.
                if (stillCaptureBuilder == null)
                    stillCaptureBuilder = mCameraDevice.CreateCaptureRequest(CameraTemplate.StillCapture);

                stillCaptureBuilder.AddTarget(mImageReader.Surface);

                SetFlash(stillCaptureBuilder);

                // Orientation
                int rotation = (int)activity.WindowManager.DefaultDisplay.Rotation;
                stillCaptureBuilder.Set(CaptureRequest.JpegOrientation, GetOrientation(rotation));

                mCaptureSession.StopRepeating();
                mCaptureSession.Capture(stillCaptureBuilder.Build(), new CameraCaptureStillPictureSessionCallback(this), null);
            }
            catch (CameraAccessException e)
            {
                e.PrintStackTrace();
            }
        }

        ControlAEMode AeFlashMode = ControlAEMode.Off;
        public void SetFlash(CaptureRequest.Builder requestBuilder)
        {
            if (mFlashSupported)
            {
                    requestBuilder.Set(CaptureRequest.ControlAeMode, (int)AeFlashMode);

            }
        }

        -------------------------------

        **//CameraCaptureSessionCallback.cs**
        public override void OnConfigured(CameraCaptureSession session)
        {
            // The camera is already closed
            if (null == owner.mCameraDevice)
            {
                return;
            }

            // When the session is ready, we start displaying the preview.
            owner.mCaptureSession = session;
            try
            {
                // Auto focus should be continuous for camera preview.
                owner.SetFocus(owner.mPreviewRequestBuilder);
                
                // Flash is automatically enabled when necessary.
                owner.SetFlash(owner.mPreviewRequestBuilder);

                // Finally, we start displaying the camera preview.
                owner.mPreviewRequest = owner.mPreviewRequestBuilder.Build();
                owner.mCaptureSession.SetRepeatingRequest(owner.mPreviewRequest,
                        owner.mCaptureCallback, owner.mBackgroundHandler);
            }
            catch (CameraAccessException e)
            {
                e.PrintStackTrace();
            }
        }

标签: xamarinandroid-camera2

解决方案


您可以将以下代码添加到您的CameraCaptureSessionCallback.cs

 public  void ISFlashOpenOrClose(bool isTorchOn)
        {
            owner.mCaptureSession = this.session;
            if (isTorchOn)
            {
                owner.mPreviewRequestBuilder.Set(CaptureRequest.FlashMode, (int)ControlAEMode.On);
               // owner.mPreviewRequestBuilder.Set(CaptureRequest.FlashMode, (int)FlashMode.Off);

                // mPreviewSession.SetRepeatingRequest(mPreviewBuilder.build(), null, null);
                owner.mPreviewRequest = owner.mPreviewRequestBuilder.Build();
                owner.mCaptureSession.SetRepeatingRequest(owner.mPreviewRequest,
                        owner.mCaptureCallback, owner.mBackgroundHandler);
               // isTorchOn = false;
            }
            else
            {
               
                owner.mPreviewRequestBuilder.Set(CaptureRequest.ControlAeMode, (int)ControlAEMode.Off);
               

                owner.mPreviewRequest = owner.mPreviewRequestBuilder.Build();
                owner.mCaptureSession.SetRepeatingRequest(owner.mPreviewRequest,
                        owner.mCaptureCallback, owner.mBackgroundHandler);
            
            }
        }

这是所有关于CameraCaptureSessionCallback.cs

public class CameraCaptureSessionCallback : CameraCaptureSession.StateCallback
    {
        private readonly Camera2BasicFragment owner;
        CameraCaptureSession session;

        public CameraCaptureSessionCallback(Camera2BasicFragment owner)
        {
            if (owner == null)
                throw new System.ArgumentNullException("owner");
            this.owner = owner;
        }

        public override void OnConfigureFailed(CameraCaptureSession session)
        {
            owner.ShowToast("Failed");
        }
        private bool isTorchOn;
        public override void OnConfigured(CameraCaptureSession session)
        {
            // The camera is already closed
            if (null == owner.mCameraDevice)
            {
                return;
            }
            this.session = session;
            // When the session is ready, we start displaying the preview.
            owner.mCaptureSession = session;

            try
            {
                // Auto focus should be continuous for camera preview.
                owner.mPreviewRequestBuilder.Set(CaptureRequest.ControlAfMode, (int)ControlAFMode.ContinuousPicture);
                // Flash is automatically enabled when necessary.
                owner.SetAutoFlash(owner.mPreviewRequestBuilder);
                // Flash is automatically enabled when necessary.
              //  owner.SetFlash(owner.mPreviewRequestBuilder);
                // Finally, we start displaying the camera preview.
                owner.mPreviewRequest = owner.mPreviewRequestBuilder.Build();
                owner.mCaptureSession.SetRepeatingRequest(owner.mPreviewRequest,
                        owner.mCaptureCallback, owner.mBackgroundHandler);
            }
            catch (CameraAccessException e)
            {
                e.PrintStackTrace();
            }
        }

        public  void ISFlashOpenOrClose(bool isTorchOn)
        {
            owner.mCaptureSession = this.session;
            if (isTorchOn)
            {
                owner.mPreviewRequestBuilder.Set(CaptureRequest.FlashMode, (int)ControlAEMode.On);
               // owner.mPreviewRequestBuilder.Set(CaptureRequest.FlashMode, (int)FlashMode.Off);

                // mPreviewSession.SetRepeatingRequest(mPreviewBuilder.build(), null, null);
                owner.mPreviewRequest = owner.mPreviewRequestBuilder.Build();
                owner.mCaptureSession.SetRepeatingRequest(owner.mPreviewRequest,
                        owner.mCaptureCallback, owner.mBackgroundHandler);
               // isTorchOn = false;
            }
            else
            {
               
                owner.mPreviewRequestBuilder.Set(CaptureRequest.ControlAeMode, (int)ControlAEMode.Off);
               

                owner.mPreviewRequest = owner.mPreviewRequestBuilder.Build();
                owner.mCaptureSession.SetRepeatingRequest(owner.mPreviewRequest,
                        owner.mCaptureCallback, owner.mBackgroundHandler);
            
            }
        }
    }
}

ISFlashOpenOrClose您可以在运行时通过方法更改它。


推荐阅读