简体   繁体   中英

Camera preview face detection failed

In my Xamarin.forms android app, I am using IFaceDetectionListener Doc , for detecting faces in custom camera preview. When I try to open my custom camera page I am getting error like this.

Java.Lang.RuntimeException: start face detection failed

My stack traces are

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

This error occurs on my OnElementChanged of 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() { }
        
            }

I am not able to isolate the issue. The app gets crash with error saying "start Face detection failed". Since I am using older camera API , will that cause this issue? Please help me to fix this issue. For the convenience I have the sample project here. sample Project

EDIT

I am able to catch the exception like this

                                 try
                                    {
                                        Control.Preview.SetFaceDetectionListener(this);
                                        Control.Preview.StartFaceDetection();
                                    }
                                    catch (Java.Lang.RuntimeException ex)
                                    {                                      
                                                                                                                                                               
                                    }

I test your sample,and when i don't use a mode page to open the CameraPage ,it will work.

You could try to change which in your MainPage.xaml.cs :

await Navigation.PushModalAsync(new CameraPage());

to

await Navigation.PushAsync(new CameraPage()); 

like:

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)
        {

        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM