运行Android Things的树莓派使用Android Camera(1) API无法连接相机
解决Android Things 0.7树莓派上二维码扫描崩溃的问题
针对你遇到的这个问题,结合Android Things早期版本的特性和树莓派Camera V2的适配情况,我整理了几个大概率的原因和对应的解决办法:
1. 相机朝向的适配问题
树莓派Camera V2在Android Things 0.7中被识别为前置相机(facing=1),但绝大多数二维码扫描库默认会优先调用后置相机。当扫描库按照后置相机的逻辑去初始化配置时,就会因为实际相机的属性不匹配而崩溃。
解决办法:
- 修改扫描代码,强制指定使用检测到的唯一相机(ID为0,因为
Camera.getNumberOfCameras()返回1),而不是依赖库的默认后置相机选择逻辑。比如在初始化扫描器时,显式传入相机ID参数:// 示例:强制使用ID为0的相机 Camera camera = Camera.open(0); - 如果使用的是ZXing等封装好的扫描库,可以找到库中相机选择的代码,把默认的后置相机判断逻辑改为直接使用第一个检测到的相机。
2. Android Things 0.7的相机API参数限制
Android Things 0.7属于早期版本,对标准Android Camera API的支持有局限性,很多手机上支持的相机参数(比如预览尺寸、像素格式)在树莓派上可能不兼容,扫描库如果强行设置这些参数就会触发崩溃。
解决办法:
- 先获取树莓派Camera V2支持的预览尺寸,再给扫描库设置对应的参数:
Camera.Parameters params = camera.getParameters(); List<Camera.Size> supportedSizes = params.getSupportedPreviewSizes(); // 选择一个合适的尺寸,比如优先选接近屏幕比例的 Camera.Size targetSize = supportedSizes.get(0); params.setPreviewSize(targetSize.width, targetSize.height); camera.setParameters(params); - 避免使用过于特殊的预览格式,尽量选择
ImageFormat.NV21这类通用格式。
3. 预览控件的兼容性问题
树莓派的显示输出和手机端差异较大,扫描库自带的SurfaceView或TextureView可能在Android Things上无法正常创建预览Surface,进而导致相机初始化失败崩溃。
解决办法:
- 尝试将扫描布局中的SurfaceView替换为TextureView,TextureView在嵌入式设备上的兼容性通常更好;
- 确保预览控件的布局参数设置合理,不要设置超出屏幕范围的尺寸,避免因为布局异常导致预览初始化失败。
4. 权限的二次确认
虽然你的应用能正常加载登录,但还是要确认相机权限是否完全生效:
- 检查
AndroidManifest.xml中是否声明了相机权限:<uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera"/> - 如果应用的目标SDK是23及以上,即使是Android Things设备,也建议在进入扫码页时动态申请一次相机权限,避免权限未正确授予导致的崩溃。
关键调试步骤
如果上面的方法还没解决问题,一定要抓取崩溃日志定位具体原因:
- 连接树莓派后执行
adb logcat *:E命令,过滤错误日志,找到崩溃的堆栈信息,比如是Camera.open()抛出异常,还是参数设置失败,或者是预览启动时的错误,根据具体日志再针对性修复。
内容的提问来源于stack exchange,提问作者Luke Simpson
相关产品推荐
相关产品推荐

