使用自定义相机时在release()之后调用的方法

时间:2015-01-08 13:00:50

标签: android opengl-es camera

我的应用关闭时出现错误在Renderer类中发布后调用的方法。我搜索但没有运气...我尝试了一些解决方案,帮助其他人(如camera.setPreviewCallback(null);)但没有...我只有三星Note 10.1与OS 4.4.2有这个问题。在其他设备上它可以正常工作。

这是ImageRenderer类中出现错误的位置:(在行camera.setPreviewTexture(mSurfaceTexture);)

public void setUpSurfaceTexture(final Camera camera, final GLSurfaceView surfaceView) {
    runOnDraw(new Runnable() {
        @Override
        public void run() {
            int[] textures = new int[1];
            GLES20.glGenTextures(1, textures, 0);
            mSurfaceTexture = new SurfaceTexture(textures[0]);
            try {                   
                camera.setPreviewTexture(mSurfaceTexture);
                camera.setPreviewCallback(GPUImageRenderer.this);
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
}

什么可能导致此错误?它是如何在我尝试的所有设备上工作的,除了这个?

错误日志:

01-08 14:52:27.791: E/AndroidRuntime(22887): FATAL EXCEPTION: GLThread 1666
01-08 14:52:27.791: E/AndroidRuntime(22887): Process: jp.co.cyberagent.android.gpuimage.sample, PID: 22887
01-08 14:52:27.791: E/AndroidRuntime(22887): java.lang.RuntimeException: Method called after release()
01-08 14:52:27.791: E/AndroidRuntime(22887):    at android.hardware.Camera.setPreviewTexture(Native Method)
01-08 14:52:27.791: E/AndroidRuntime(22887):    at jp.co.cyberagent.android.gpuimage.GPUImageRenderer$2.run(GPUImageRenderer.java:157)
01-08 14:52:27.791: E/AndroidRuntime(22887):    at jp.co.cyberagent.android.gpuimage.GPUImageRenderer.onDrawFrame(GPUImageRenderer.java:115)
01-08 14:52:27.791: E/AndroidRuntime(22887):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1532)
01-08 14:52:27.791: E/AndroidRuntime(22887):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1249)

1 个答案:

答案 0 :(得分:0)

我花了一段时间调试它......最后我发现这个问题与我所做的完全不同......我设置相机的一种方法被调用的次数超过它应该的次数,并导致了这种混乱。打开和释放相机的方法顺序是个问题。所以每个有这个问题的人都应该仔细调试它的代码。确保在释放后不使用相机,直到首先打开相机。你应该总是尝试使用这个camera.setPreviewCallback(null);我们在这里讨论过。希望它有所帮助!