【问题标题】:How to restart camera preview on Xamarin forms when using a custom renderer view for a camera preview使用自定义渲染器视图进行相机预览时如何在 Xamarin 表单上重新启动相机预览
【发布时间】:2019-04-05 00:44:13
【问题描述】:

在将应用程序置于睡眠状态或在应用程序之间切换后,我正在尝试使用 android 恢复我的相机预览。或者甚至启动一个使用相机功能的不同应用程序,但相机因 getParameters() 为空而崩溃。 恢复使用 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();
        }

【问题讨论】:

  • 能否在github上提供整个demo,我会在我身边试试你的项目。
  • 这只是原生部分pastebin.com/G4Tuy0Qp

标签: android xamarin.forms xamarin.android


【解决方案1】:

通过更深入地了解 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相机原生类中注册了handler:

        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();
    }

这解决了在打开其他使用相机的应用程序后恢复相机预览的问题,或者在相机预览超时的情况下将应用程序置于睡眠状态。

【讨论】:

    猜你喜欢
    • 2015-11-26
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    相关资源
    最近更新 更多