如何使用带有 CaptureSession.stopReapeating() 的处理程序?
How to use Handler with a CaptureSession.stopReapeating()?
我正在使用 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:尝试在空 object 引用上调用虚方法 '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)
在处理程序方法可以 运行 之前,您在代码中的某处将 mCaptureSession 重置为 null,或者此特定的 mCaptureSession 从未正确初始化。
您可以显式使用 mCaptureSession 的副本传递到处理程序中 运行nable 如果您找不到将成员变量设置为 null 的内容,则可以避免 nullness 问题,但是您仍然必须使确保在您的处理程序 运行s.
之前没有任何实际关闭会话
我正在使用 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:尝试在空 object 引用上调用虚方法 '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)
在处理程序方法可以 运行 之前,您在代码中的某处将 mCaptureSession 重置为 null,或者此特定的 mCaptureSession 从未正确初始化。
您可以显式使用 mCaptureSession 的副本传递到处理程序中 运行nable 如果您找不到将成员变量设置为 null 的内容,则可以避免 nullness 问题,但是您仍然必须使确保在您的处理程序 运行s.
之前没有任何实际关闭会话