使用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
相关产品推荐
相关产品推荐

