Как использовать обработчик с CaptureSession.stopReapeating ()? - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над приложением по распознаванию лиц с Android Studio (на основе Camera2 Api Face Recon) Проблема заключается в следующем: сеанс захвата останавливается, когда выполняются некоторые условия. Затем пользователь может сделать снимок или повторить попытку (начинается сеанс захвата). Я хотел бы дать время пользователю после того, как он использовал кнопку повтора, чтобы заменить свое лицо.

Кнопки повторного запуска и съемки появляются, когда лицо занимает более 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 / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: 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 голосов
/ 15 мая 2019

Вы сбрасываете mCaptureSession в null где-то в вашем коде до того, как метод обработчика может быть запущен, или этот конкретный mCaptureSession никогда не инициализируется правильно для начала.

Вы могли бы явно использовать копию mCaptureSession для передачи в исполняемый модуль Handler, чтобы избежать проблемы нулевого значения, если вы не можете найти то, что устанавливает переменную-член в значение null, но тогда вам все равно нужно убедиться, что ничто на самом деле не закрывает сеанс до того, как ваш обработчик работает.

...