在将应用程序置于睡眠状态或在应用程序之间切换之后,我正尝试使用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();
}
通过更全面地阅读Android相机(Camera1)硬件的行为,我能够让它工作。如果您正在使用Xamarin并尝试在应用程序中创建摄像机视图,最好的方法是制作自定义渲染器并在每个平台中创建摄像机视图。如下所示:
https://docs.microsoft.com/en-ca/xamarin/xamarin-forms/app-fundamentals/custom-renderer/view
但此示例仅显示如何创建相机预览,没有相机硬件生命周期或拍摄照片。
为了解决上述问题的问题,我只需要在Xamarin表单页面的生命周期内再次使用Camera.Open(0)来控制相机。
这是我做的(在Xamarin Forms中的CameraPreview类中):
创建的Camera open事件处理程序:
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();
}
这解决了在打开使用相机的其他应用程序或将应用程序置于睡眠状态(相机预览将超时)后恢复相机预览的问题。