You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:13:15