无法将 SurfaceTexture 设置为已释放的 SurfaceTexture

Cannot setSurfaceTexture to a released SurfaceTexture

onPause 中,我使用 mTextureView.getSurfaceTexture()

将 surfaceTexture 存储到 class 变量 mTextureViewSurface

onResume我做:

if (mTextureView.isAvailable()) {
    ...
} else {
    mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}

然后我尝试恢复表面纹理

@Override
public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
        if (mTextureViewSurface != null) {
            mTextureView.setSurfaceTexture(mTextureViewSurface);
        }
}

但是我得到了错误 java.lang.IllegalArgumentException: Cannot setSurfaceTexture to a released SurfaceTexture 来自 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/TextureView.java#725

我累了,可能只是想睡觉,但我想我应该在这里问一下,因为我可能只是在掩盖一些事情。

处理释放的表面纹理的正确方法是什么?

来自onSurfaceTextureDestroyed()的return值很重要——你需要returnfalse来防止系统破坏它(你需要手动释放它最终)。

您可以在 Grafika "double decode" [=25] 中找到在 "fast" Activity pause/resume 中保留 SurfaceTextures 的有效代码示例(例如,用于方向更改) =].

请注意,Android <= 4.4 中存在一个错误,可能会使正确操作变得棘手——如果您尝试在 onSurfaceTextureAvailable() 中重新附加,它似乎可以工作,但不会成功更新。