Google Pixel2 Android8.1录制视频时拍照相机冻结问题求助
兄弟,这个问题我适配Pixel设备的时候碰到过类似的,虽然isVideoSnapshotSupported()返回true,但Pixel 2在Android 8.1上的相机底层逻辑和Galaxy S9这类设备差异不小,给你几个可以尝试的方案:
1. 先暂停录制再拍照,拍完恢复
Pixel的相机在录制时对资源锁定很严,直接调用takePicture()容易导致资源冲突。试试先暂停MediaRecorder,拍完照再恢复:
// 暂停视频录制 mMediaRecorder.pause(); // 执行拍照,只保留必要的回调 mCamera.takePicture(shutterCallback, null, null, jpegCallback); // 在JPEG回调里恢复录制 private PictureCallback jpegCallback = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 处理你的照片数据 try { // 恢复录制 mMediaRecorder.resume(); } catch (IllegalStateException e) { // 有些场景下resume会抛异常,这里可以做降级处理,比如重启录制 mMediaRecorder.start(); } } };
2. 去掉不必要的拍照回调
很多厂商的相机底层在视频模式下,不支持raw或postview格式的回调,哪怕API说支持。你把takePicture()里的raw和postview回调设为null,只保留shutter和jpeg回调,大概率能避免触发底层的异常逻辑。
3. 强制匹配视频兼容的拍照尺寸
Pixel 2的相机可能对拍照尺寸和视频分辨率的兼容性要求更高,你可以在启动录制前,把拍照尺寸设置成和视频分辨率接近的大小:
Camera.Parameters params = mCamera.getParameters(); // 先获取当前视频录制的分辨率,比如你设置的是1080p int videoWidth = 1920; int videoHeight = 1080; // 从支持的拍照尺寸里选匹配的 for (Camera.Size size : params.getSupportedPictureSizes()) { if (size.width == videoWidth && size.height == videoHeight) { params.setPictureSize(size.width, size.height); break; } } // 显式开启视频快照支持(虽然API文档说不需要,但Pixel可能吃这一套) params.setVideoSnapshotSupported(true); mCamera.setParameters(params);
4. 考虑迁移到Camera2 API
旧的Camera API在Android 8.1之后,Google已经不再重点维护了,尤其是Pixel系列,对Camera2的支持更好。Camera2的CaptureSession可以同时处理视频录制和拍照请求,逻辑更灵活,也能避免旧API的兼容性坑。比如可以先停止视频的重复捕获请求,发送拍照请求,完成后再恢复视频录制,流程比旧API清晰很多。
5. 抓Logcat找底层错误
如果上面的方法都不行,你把Pixel 2连电脑,过滤camera、mediaserver、hal这些关键词的日志,冻结的时候肯定能看到底层抛出的错误信息,比如资源占用冲突、HAL层异常之类的,顺着日志找问题会更精准。
内容的提问来源于stack exchange,提问作者YRfree Developers

