如何解决相机预览人脸检测失败
在我的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)
{
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。