You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TextureView作为相机预览时出现黑屏问题求助

解决TextureView相机预览黑屏问题

嘿,我来帮你排查下用TextureView实现相机预览时出现黑屏的常见原因和解决办法~

1. 确保SurfaceTexture就绪后再初始化相机

TextureView的SurfaceTexture需要完全就绪才能作为相机预览的载体,你得在onSurfaceTextureAvailable回调里去初始化相机,而不是在onCreate里直接操作。比如补全这段关键代码:

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
    // 打开相机(API 21+建议使用Camera2 API,这里先以旧Camera API为例)
    Camera camera = Camera.open();
    try {
        // 绑定SurfaceTexture到相机
        camera.setPreviewTexture(surface);
        // 调整相机预览尺寸(匹配TextureView的宽高比例,避免黑屏或拉伸)
        Camera.Parameters params = camera.getParameters();
        List<Camera.Size> previewSizes = params.getSupportedPreviewSizes();
        Camera.Size optimalSize = getOptimalPreviewSize(previewSizes, width, height);
        params.setPreviewSize(optimalSize.width, optimalSize.height);
        camera.setParameters(params);
        // 启动预览
        camera.startPreview();
    } catch (IOException e) {
        Log.e("CameraPreview", "设置预览失败", e);
        if (camera != null) {
            camera.release();
        }
    }
}

别忘了让你的Activity实现TextureView.SurfaceTextureListener接口,并重写所有相关回调方法。

2. 检查相机权限是否正确申请

Android 6.0及以上版本需要动态申请相机权限,如果权限没拿到,相机根本打不开,自然会黑屏:

  • 首先在AndroidManifest.xml里声明权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
  • 然后在Activity里动态请求权限:
private static final int CAMERA_PERMISSION_REQUEST = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST);
    } else {
        // 权限已授予,初始化TextureView和相机
        initCameraPreview();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == CAMERA_PERMISSION_REQUEST) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            initCameraPreview();
        } else {
            Toast.makeText(this, "需要相机权限才能开启预览", Toast.LENGTH_SHORT).show();
        }
    }
}

3. 正确释放相机资源

如果相机实例没有正确释放,再次打开会失败导致黑屏。一定要在合适的生命周期节点释放相机:

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
    if (camera != null) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }
    return true;
}

@Override
protected void onPause() {
    super.onPause();
    // 后台时释放相机,避免占用系统资源
    if (camera != null) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }
}

4. 检查TextureView的布局属性

确保你的TextureView在布局里是可见的,没有被其他View遮挡,宽高设置合理(比如match_parent或固定尺寸),不要设置成wrap_content或者0dp导致不可见。

你可以对照这些点检查你的代码,看看哪一步没做到位~

内容的提问来源于stack exchange,提问作者S.M_Emamian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:01:44