相机预览人脸检测失败

问题描述

在我的Xamarin.forms android应用中,我使用IFaceDetectionListener Doc来在自定义相机预览中检测人脸。当我尝试打开自定义相机页面时,出现这样的错误

java.lang.RuntimeException: start face detection Failed

我的堆栈跟踪为

jnienvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance,Java.Interop.JniObjectReference type,Java.Interop.JniMethodInfo method,Java.Interop.JniArgumentValue* args)
JniPeerMembers+JniInstanceMethods.InvokeNonvirtualVoidMethod (System.String encodedMember,Java.Interop.IJavaPeerable self,Java.Interop.JniArgumentValue* parameters)
Camera.StartFaceDetection ()
CameraPrevieWrenderer+<>c__displayClass8_0.<OnElementChanged>b__1 ()
Thread+RunnableImplementor.Run ()
mono.java.lang.RunnableImplementor.run RunnableImplementor.java:30
android.os.Handler.handleCallback Handler.java:883

错误发生在我的OnElementChanged的CameraCustomrender上。

CameraCustomrender

  public class CameraPrevieWrenderer : VieWrenderer<App.Views.Clocking.CustomCamera.CameraPreview,App.Droid.Customrender.Clocking.CameraPreview>,Camera.IFaceDetectionListener,Camera.IPictureCallback,Camera.IShutterCallback
            {
                CameraPreview cameraPreview;
                String Picture_Name = "";
                private CameraFacing camerainfo = CameraFacing.Front;
                int DetectedFaceCount = 0;
        
                [get: Android.Runtime.Register("getMaxnumDetectedFaces","()I","GetGetMaxnumDetectedFacesHandler",ApiSince = 14)]
                public virtual int MaxnumDetectedFaces { get; }
        
                public CameraPrevieWrenderer(Context context) : base(context)
                {           
                }
        
                [Obsolete]
                protected  override void OnElementChanged(ElementChangedEventArgs<Centraverse.Views.Clocking.CustomCamera.CameraPreview> e)
                {
                    try
                    {
                        base.OnElementChanged(e);
                        if (Control == null)
                        {
                            try
                            {
                                cameraPreview = new CameraPreview(Context);
                                SetNativeControl(cameraPreview);
                            }
                            catch (Exception ex)
                            {
                             
                            }
        
                        }
                        if (e.OldElement != null)
                        {
                        }
                        if (e.NewElement != null)
                        {
                            try
                            {
                                if (Control == null)
                                {
                                    cameraPreview = new CameraPreview(Context);
                                    SetNativeControl(cameraPreview);
                                }
                                Control.Preview = Camera.Open((int)e.NewElement.Camera);
                                Control.CameraID = 1;
        
                                var CameraParaMeters = cameraPreview.camera.GetParameters();
                                if (CameraParaMeters != null)
                                {
                                    if (CameraParaMeters.MaxnumDetectedFaces > 0)
                                    {
                                        Device.BeginInvokeOnMainThread(() =>
                                        {

  >------------------// Getting crashed at here-------------------------------------<
                                            Control.Preview.SetFaceDetectionListener(this);
                                            Control.Preview.StartFaceDetection();
                                        });
                                    }
                                }
                               
                            }
                            catch (Exception ex)
                            {
                              
                            }
                        }
                    }
                    catch(Exception ex)
                    {
                        
                    }      
                }
        
        
        
        
                protected override void dispose(bool disposing)
                {
                    try
                    {
                        if (disposing)
                        {
                            Control.Preview.Release();
                            MessagingCenter.Unsubscribe<Object>(this,"CaptureClick");
                            MessagingCenter.Unsubscribe<Object>(this,"FlipClick");
                        }
                        Device.BeginInvokeOnMainThread(base.dispose);
        
                    }
                    catch (Exception ex)
                    {
                        
                    }
        
                }
        
                [Obsolete]
                public void OnFaceDetection(Camera.Face[] faces,Camera camera)
                {
                    try
                    {
                        DetectedFaceCount = faces.Length;
                    }
                    catch (Exception ex)
                    {
                        
                    }
        
                }
        
                private  void takepicture()
                {
                    try
                    {
                        Control.Preview.TakePicture(this,this,this);
                    }
                    catch (Exception ex)
                    {
                       
                    }
                }
        
        
                public  void OnPictureTaken(byte[] data,Camera camera)
                {
                    try
                    {
                       // Managing camera capture        
                    }
                    catch (Exception ex)
                    {        
                    }
                }
        
                public void OnShutter() { }
        
            }

我无法找出问题所在。该应用程序崩溃,并显示“启动面部检测失败”错误。由于我使用的是旧的相机API,这会导致此问题吗?请帮助我解决此问题。为方便起见,我在这里有示例项目。sample Project

编辑

我能够捕捉到这样的异常

                                 try
                                    {
                                        Control.Preview.SetFaceDetectionListener(this);
                                        Control.Preview.StartFaceDetection();
                                    }
                                    catch (java.lang.RuntimeException ex)
                                    {                                      
                                                                                                                                                               
                                    }

解决方法

我测试了您的样品,当我不使用模式页打开CameraPage时,它将起作用。

您可以尝试更改MainPage.xaml.cs中的哪个:

await Navigation.PushModalAsync(new CameraPage());

await Navigation.PushAsync(new CameraPage()); 

喜欢:

private async void Open_Camera(object sender,EventArgs e)
    {
        try
        {
            var PhotoRequeststatus = await Permissions.RequestAsync<Permissions.Camera>();
            var StorageRequStatus = await Permissions.RequestAsync<Permissions.StorageWrite>();
            if (PhotoRequeststatus != Xamarin.Essentials.PermissionStatus.Granted || StorageRequStatus != Xamarin.Essentials.PermissionStatus.Granted)
            {
                await DisplayAlert("Enable Permission","Please allow camera permission","Close");
            }
            else
            {

                await Navigation.PushAsync(new CameraPage()); 
            }
        }

        catch(Exception ex)
        {

        }
    }