.NET MAUI获取Android摄像头实时流实现应用内预览拍照咨询
.NET MAUI Android 端 CameraX 应用内预览+拍照实现方案
直接走「共享层自定义控件 + 平台Handler对接原生CameraX」的路径即可,不需要调用系统media selector,全流程在应用内完成,代码量小兼容性高,落地步骤如下:
- 共享层基础控件定义
在共享项目新建继承自View的CameraPreview类,添加3个核心成员:- 可绑定属性
IsPreviewActive(bool类型),用于控制预览启停 - 可绑定属性
CaptureCommand(ICommand类型),用于触发拍照动作 - 事件
PhotoCaptured(事件参数为Stream类型),用于把捕获的图片流回传给业务层
- 可绑定属性
- Android 项目前置配置
- 编辑
Platforms/Android/AndroidManifest.xml,添加必要权限与特性声明:<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="true" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> - 给Android项目安装对应版本的CameraX依赖包:
Xamarin.AndroidX.Camera.Core、Xamarin.AndroidX.Camera.Camera2、Xamarin.AndroidX.Camera.Lifecycle、Xamarin.AndroidX.Camera.View,版本号和当前MAUI版本绑定的AndroidX库版本对齐即可,避免版本冲突。
- 编辑
- 平台Handler实现
为CameraPreview编写Android端Handler:- Handler的原生视图直接用CameraX官方提供的
PreviewView,不要自定义SurfaceView/SurfaceHolder,减少兼容性问题。 - 重写
ConnectHandler方法,首先动态申请CAMERA权限,权限校验通过后再执行CameraX初始化逻辑。 - 初始化时先获取
ProcessCameraProvider单例,构造两个核心用例:预览用的Preview实例、拍照用的ImageCapture实例,把两个用例绑定到当前页面所在Activity的LifecycleOwner上,生命周期完全交给CameraX托管,不需要手动写页面切后台释放、回前台重连的逻辑。 - 等
PreviewView完成布局渲染后,再把Preview实例的SurfaceProvider绑定到PreviewView的SurfaceProvider上——这是绝大多数人调试预览黑屏的核心原因,提前绑定会拿不到有效的渲染Surface。
- Handler的原生视图直接用CameraX官方提供的
- 拍照功能实现
响应共享层CaptureCommand的调用,直接用初始化好的ImageCapture实例执行TakePicture方法,输出选项可选内存流或者临时文件,捕获完成后把图片字节转为Stream,通过PhotoCaptured事件传回共享层,即可在业务层实现图片保存、展示、上传等逻辑。 - 常见问题排查
- 预览黑屏:优先检查摄像头权限是否授予,其次检查Preview和PreviewView的绑定时机是否在控件布局完成后,最后确认CameraX绑定的是当前Activity的生命周期,而非Application全局生命周期。
- 拍照画面变形:将
PreviewView的ScaleType设置为FillCenter,同时让ImageCapture的目标宽高比和CameraPreview控件的实际宽高比保持一致,不要硬编码固定比例。 - 切后台崩溃:不要手动持有Camera实例做生命周期管理,全量交给Lifecycle组件托管即可,CameraX会自动处理资源释放与重连。
不建议直接依赖第三方跨平台相机插件,这类插件普遍存在MAUI版本适配滞后、自定义能力不足的问题,自行对接CameraX的核心代码不到200行,后续迭代可控性更高。
内容的提问来源于stack exchange,提问作者user14386474
相关产品推荐
相关产品推荐

