lockCanvas一直抛出异常

5

我从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)
2个回答

2

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

if(!getHolder().getSurface().isValid()){
continue;
}

如果不在循环内,请尝试将所有代码(从锁定画布及以下)放入此if语句中:
if(getHolder().getSurface().isValid()){
//code goes here
}

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tim Hsu
我添加了isValid,它通过了。问题仍然存在。 - Tim Hsu
我想知道为什么我们不能锁定设置在相机预览阶段的表面。 - Tim Hsu
我成功解决了这个问题。但是,我在使用MediaRecorder和Opencv录制屏幕时遇到了问题,因为JavaCameraView已经打开了相机实例。你有什么建议吗? - user3186023
2
有人可以分享修复方法吗? - Federico Ponzi
显示剩余2条评论

1

我曾经遇到过同样的问题,解决方法就是——信不信由你——将这部分注释掉!它试图在调用mCamera.startPreview()时重新绘制正在绘制的内容。


我解决了这个问题,但是我忘记了细节,非常抱歉。我唯一还记得的是我修改了SDK代码。 - Tim Hsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接