java - 如何将 Handler 与 CaptureSession.stopReapeating() 一起使用?

标签 java android repeat detection face-detection

我正在使用 android studio 开发面部检测应用程序(基于 Camera2 Api 面部识别)。问题如下:当某些条件成立时,捕获 session 将停止。然后,用户可以拍照或重试(捕获 session 启动)。我想在用户使用重试按钮后给他一些时间来更换他的脸。

当人脸占据屏幕的 20% 以上时,会出现重试和拍照按钮。同时,我使用 stopRepeating 来卡住相机捕获 session 。我尝试将这些函数放入处理程序中,但是当我将 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;


  }
});

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

[编辑]这是错误

2019-05-15 08:44:12.149 28923-28923/weladee.frontware.com.weladee_android E/AndroidRuntime:致命异常:main 进程: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( native 方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

最佳答案

在处理程序方法可以运行之前,您将在代码中的某个位置将 mCaptureSession 重置为 null,或者这个特定的 mCaptureSession 从未正确初始化。

如果您找不到将成员变量设置为 null 的内容,您可以显式使用 mCaptureSession 的副本传递到 Handler runnable 中以避免 null 问题,但您仍然必须确保之前没有任何内容实际关闭 session 您的处理程序运行。

关于java - 如何将 Handler 与 CaptureSession.stopReapeating() 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56123221/

相关文章:

java - 如果我发现错误会发生什么?

java - 如何检查 JsonElement 中的项目是否存在于单独的 JsonArray 中?

java - 使用 renderScript 放大位图的一部分

ansible - 有没有办法让角色在戏剧中成功之前?

html - 垂直重复 VML 形状

java - 要在异步调用上实现优雅的关闭检查锁定,还是要处理异常?

java - 用jsoup解析html并去掉标签 block

android - 新创建的布局文件未添加到 R.java

java - JNI 在 android/java 中解析 jstring 或 char* 而不使用 std

android - MenuScene 上的 RepeatingSpriteBackground