MAUI在OSX(Mac Catalyst)调用CapturePhotoAsync出现黑屏问题
MAUI Mac Catalyst下MediaPicker拍照黑屏问题排查及解决
在Android模拟器中调用MediaPicker.Default.CapturePhotoAsync()能正常显示模拟相机视图,但在Mac Catalyst(OSX)环境下执行同一代码时,仅显示黑屏,相机按钮呈暗红色且无法点击。已按官方文档配置Info.plist权限,MAUI版本试过9.0.90及其他9.0.x旧版本。
调用代码
var photo = await MediaPicker.Default.CapturePhotoAsync();
已配置的Info.plist权限
<key>NSCameraUsageDescription</key> <string>This app needs access to the camera to take photos.</string> <key>NSMicrophoneUsageDescription</key> <string>This app needs access to microphone for taking videos.</string> <key>NSPhotoLibraryAddUsageDescription</key> <string>This app needs access to the photo gallery for picking photos and videos.</string> <key>NSPhotoLibraryUsageDescription</key> <string>This app needs access to photos gallery for picking photos and videos.</string>
排查及解决步骤
检查Mac系统权限
打开系统设置 → 隐私与安全性 → 相机,确认你的MAUI应用已被授予相机访问权限。即使Info.plist配置正确,系统层面可能未授权。若未找到应用,可先删除应用重新部署,触发权限请求弹窗后选择允许。验证权限配置准确性
确保Info.plist中的NSCameraUsageDescription描述清晰准确,Mac Catalyst对权限描述的要求和iOS一致,不能留空或模糊。替换为原生相机实现(临时方案)
若官方MediaPicker在Mac Catalyst上存在兼容性问题,可尝试使用NSCameraCaptureSession原生实现拍照功能,示例代码如下:#if MACCATALYST using AVFoundation; using Foundation; using UIKit; public async Task<string> CapturePhotoNative() { var captureSession = new AVCaptureSession(); captureSession.SessionPreset = AVCaptureSession.PresetPhoto; var cameraDevice = AVCaptureDevice.GetDefaultDevice(AVMediaType.Video); if (cameraDevice == null) return null; var input = await AVCaptureDeviceInput.FromDeviceAsync(cameraDevice); if (input == null) return null; if (captureSession.CanAddInput(input)) captureSession.AddInput(input); var output = new AVCapturePhotoOutput(); if (captureSession.CanAddOutput(output)) captureSession.AddOutput(output); captureSession.StartRunning(); var photoSettings = AVCapturePhotoSettings.FromFormat(output.AvailablePhotoPixelFormatTypes[0]); var tcs = new TaskCompletionSource<string>(); output.CapturePhoto(photoSettings, new PhotoCaptureDelegate(tcs)); var photoPath = await tcs.Task; captureSession.StopRunning(); return photoPath; } private class PhotoCaptureDelegate : AVCapturePhotoCaptureDelegate { private readonly TaskCompletionSource<string> _tcs; public PhotoCaptureDelegate(TaskCompletionSource<string> tcs) { _tcs = tcs; } public override void DidFinishProcessingPhoto(AVCapturePhotoOutput output, AVCapturePhoto photo, NSError error) { if (error != null) { _tcs.SetException(new Exception(error.LocalizedDescription)); return; } var data = photo.FileDataRepresentation; var tempPath = Path.Combine(Path.GetTempPath(), $"photo_{Guid.NewGuid()}.jpg"); File.WriteAllBytes(tempPath, data.ToArray()); _tcs.SetResult(tempPath); } } #endif使用时直接调用
CapturePhotoNative()替代MediaPicker.Default.CapturePhotoAsync()即可。更新版本或反馈问题
尝试升级到MAUI最新稳定版(如9.0.100+),看是否已修复该兼容性问题。若问题仍存在,可向MAUI官方仓库提交Issue,附上详细环境信息和复现步骤。
内容的提问来源于stack exchange,提问作者LosManos
相关产品推荐
相关产品推荐

