Java lockCanvas不断抛出异常

Java lockCanvas不断抛出异常,java,android,opencv4android,Java,Android,Opencv4android,我从opencv4android(人脸检测)复制了示例代码。我通过了NDK部分。并在手机上运行应用程序。但是,SurfaceView仅显示相机预览。似乎在OnCameraFrame中所做的任何操作都不会影响SurfaceView上的画布。所以我追踪他们的SDK。问题出在deliverAndDrawFrame函数中。以前有人有过同样的问题吗 Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { canvas.drawColo

我从opencv4android(人脸检测)复制了示例代码。我通过了NDK部分。并在手机上运行应用程序。但是,SurfaceView仅显示相机预览。似乎在OnCameraFrame中所做的任何操作都不会影响SurfaceView上的画布。所以我追踪他们的SDK。问题出在deliverAndDrawFrame函数中。以前有人有过同样的问题吗

Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
Log.d(TAG, "mStretch value: " + mScale);

if (mScale != 0) {
    canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
                     new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2),
                     (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2),
                     (int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2 + mScale*mCacheBitmap.getWidth()),
                     (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2 + mScale*mCacheBitmap.getHeight())), null);
} else {
    canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
                     new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,
                     (canvas.getHeight() - mCacheBitmap.getHeight()) / 2,
                     (canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(),
                     (canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null);
}

if (mFpsMeter != null) {
    mFpsMeter.measure();
    mFpsMeter.draw(canvas, 20, 30);
}
getHolder().unlockCanvasAndPost(canvas);
}
错误:

10-09 21:57:47.485  28018-28088/com.example.tim.r3dmobileclient E/SurfaceHolder﹕ Exception locking surface
java.lang.IllegalArgumentException
        at android.view.Surface.nativeLockCanvas(Native Method)
        at android.view.Surface.lockCanvas(Surface.java:253)
        at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:848)
        at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:816)
        at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:412)
        at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:348)
        at java.lang.Thread.run(Thread.java:841)

在尝试锁定画布之前,是否尝试检查曲面是否有效? 如果所有这些代码都在循环中,请在锁定画布之前尝试放置这些代码:

if(!getHolder().getSurface().isValid()){
continue;
}
如果它不在循环中,请尝试将所有代码(从锁定画布和下面)放入此If语句中:

if(getHolder().getSurface().isValid()){
//code goes here
}

我也有同样的问题,要解决它-信不信由你-只需评论掉这部分!
当您调用mCamera.startPreview()时,它试图重新绘制正在绘制的内容

我上面介绍的代码在他们的sdk中。我已经检查了在lockConvasI添加isValid之前运行的surfaceCreated方法。就这样过去了。问题仍然存在,我想知道我们不能锁定相机预览中设置的曲面stage@TimHsu你有没有找到解决办法?遇到同样的问题有人可以分享修复吗?我解决了问题,但我忘记了细节,非常抱歉。我只记得我修改了SDK代码。