如何将Handler与CaptureSession.stopReapeating()配合使用?

时间:2019-05-14 04:53:43

标签: java android detection repeat face

我正在使用android studio开发人脸检测应用程序(基于Camera2 Api人脸侦察)。问题如下:满足某些条件时,捕获会话将停止。然后,用户可以拍照或重试(开始捕获会话)。我想在用户使用“重试”按钮以替换其面部后给用户时间。

当面部占屏幕的20%以上时,按钮重试并拍照。在同一时间,我使用stopRepeating来冻结摄像机捕获会话。我试图将这些函数放入处理程序中,但是当我将stopRepeating放入处理程序中时,应用程序崩溃了。

if(face/sizeEc>0.20 && face/sizeEc<0.6){

  new Handler().postDelayed(new Runnable() {

    @Override
    public void run() {

      TextView textView = (TextView) getView().findViewById(R.id.picture);
      textView.setVisibility(View.VISIBLE);
      TextView textView2 = (TextView) getView().findViewById(R.id.picture2);
      textView2.setVisibility(View.VISIBLE);
      try {
        mCaptureSession.stopRepeating();
      } catch (CameraAccessException e) {
        e.printStackTrace();
      }


    }
  }, 2000);

  //I tried to use this handler in order to allow user to replace his head
  //But there is a problem when the handler is used with stopRepeating

}

和“重试”按钮的代码:

textView2.setOnClickListener(new View.OnClickListener() {

  @Override
  public void onClick(View view) {


    try {
      mCaptureSession.setRepeatingRequest(mPreviewRequest,
        mCaptureCallback, mBackgroundHandler);
    } catch (CameraAccessException e) {
      e.printStackTrace();
    }
    textView.setVisibility(View.GONE);
    textView2.setVisibility(View.GONE);
    asDelayed=true;


  }
});

正如我所说,当我这样做时,重试后使用拍照会导致应用程序崩溃。在重试按钮后,我想给用户一些时间来替换他的脸。

[EDIT]这是错误

2019-05-15 08:44:12.149 28923-28923 / weladee.frontware.com.weladee_android E / Android运行时:致命异常:主     流程:weladee.frontware.com.weladee_android,PID:28923     java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.hardware.camera2.CameraCaptureSession.stopRepeating()'         在weladee.frontware.com.weladee_android.utils.front_camera.CameraFacingFront $ 4 $ 1 $ 1.run(CameraFacingFront.java:429)         在android.os.Handler.handleCallback(Handler.java:761)         在android.os.Handler.dispatchMessage(Handler.java:98)         在android.os.Looper.loop(Looper.java:156)         在android.app.ActivityThread.main(ActivityThread.java:6523)         在java.lang.reflect.Method.invoke(本机方法)         在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:942)         在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

1 个答案:

答案 0 :(得分:0)

您需要先将mCaptureSession重置为代码中的null才能运行处理程序方法,否则此mCaptureSession永远不会正确初始化。

如果找不到导致成员变量设置为null的原因,则可以显式使用mCaptureSession的副本传递到Handler runnable中,以避免出现null问题,但是您仍然必须确保在此之前没有任何东西真正关闭会话您的处理程序运行。