使用自定义渲染器视图进行相机预览时,如何在Xamarin表单上重新启动相机预览

时间:2019-04-02 20:51:06

标签: android xamarin.forms xamarin.android

在应用进入睡眠状态或在应用之间进行切换后,我试图使用android恢复我的相机预览。甚至启动使用摄像头功能但摄像头崩溃且getParameters()为null的其他应用。 使用Xamarin表单应用程序恢复操作时,是否可以检索除摄像机预览以外的控件。

我尝试使用Camera.Restart(),但没有用。


        public void SurfaceCreated(ISurfaceHolder holder)
        {
            try
            {
                if (Preview != null)
                {
                    Preview.StopPreview();
                    Preview.Reconnect();
                    Preview.SetPreviewDisplay(holder);
                    Preview.EnableShutterSound(true);
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(@"           ERROR: ", ex.Message);
            }
        }

        public void SurfaceDestroyed(ISurfaceHolder holder)
        {
            Preview.StopPreview();
            Preview.Release();
        }

        public void SurfaceChanged(ISurfaceHolder holder, Android.Graphics.Format format, int width, int height)
        {
            Camera.Parameters parameters = Preview.GetParameters();
            parameters.FocusMode = Camera.Parameters.FocusModeContinuousPicture;
            IList<Camera.Size> previewSizes = parameters.SupportedPreviewSizes;
            // You need to choose the most appropriate previewSize for your app
            Camera.Size previewSize = previewSizes[0];
            parameters.SetPreviewSize(previewSize.Width, previewSize.Height);
            Preview.SetParameters(parameters);
            Preview.StartPreview();
        }

1 个答案:

答案 0 :(得分:0)

通过更详尽地了解Android相机(Camera1)硬件的行为,我使其能够正常工作。 如果您正在使用Xamarin并尝试在应用程序中创建相机视图,则最好的方法是制作自定义渲染器并在每个平台上创建相机视图。就像这里显示的一样:

https://docs.microsoft.com/en-ca/xamarin/xamarin-forms/app-fundamentals/custom-renderer/view

但是此示例仅显示了如何创建相机预览,没有相机硬件生命周期或不包含拍照。

要解决上述问题,我只需要执行Camera.Open(0)即可在Xamarin表单页面的生命周期内再次控制摄像机。

这就是我所做的(在Xamarin Forms的CameraPreview类中):

创建的相机打开事件处理程序:

public event EventHandler CloseCameraRequest;

创建了调用事件的方法:

public void OpenCamera()
    {
        OpenCameraRequest?.Invoke(this, EventArgs.Empty);
    }

在android相机本机类中注册处理程序:

        protected override void OnElementChanged(ElementChangedEventArgs<CameraPreview> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            _nativeCameraPreview = new NativeCameraPreview(Context);
            _nativeCameraPreview.PhotoCaptured += OnPhotoCaptured;
            SetNativeControl(_nativeCameraPreview);
        }
        Control.Preview = Camera.Open(0);
        if (e.OldElement != null)
        {
            e.NewElement.OpenCameraRequest -= OnOpenCameraRequest;
        }
        if (e.NewElement != null)
        {
            e.NewElement.OpenCameraRequest += OnOpenCameraRequest;
        }
    }

    private void OnOpenCameraRequest(object sender, EventArgs e)
    {
        Control.Preview = Camera.Open(0);
    }

从Xamarin表单页面的OnAppearing方法一直调用请求:

protected override void OnAppearing()
    {
        base.OnAppearing();
        CameraPreview.OpenCamera();
    }

此问题解决了在打开其他使用该相机的应用程序或使该应用程序进入相机预览会超时的睡眠状态后恢复相机预览的问题。