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

Xamarin.iOS调用AVCaptureDeviceInput.FromDevice获取视频时崩溃如何解决?

问题原因及解决方案

1. 核心崩溃原因:缺少相机权限

从原生崩溃栈出现的TCC.framework可直接定位问题:iOS系统要求访问相机前必须先获取用户授权,且需要在项目Info.plist中配置相机使用说明。如果未完成权限配置直接调用*AVCaptureDeviceInput.FromDevice*,系统会直接杀死应用,不会抛出可被C#层捕获的托管异常。
你需要先完成以下配置和流程调整:

  • 在Info.plist中添加NSCameraUsageDescription项,值填写向用户说明相机使用目的的文本,例如"需要访问相机以扫描二维码"
  • 初始化相机前先检查权限状态,用户授权通过后再执行SetUp方法中的相机初始化逻辑,权限检查示例代码:
var status = AVCaptureDevice.GetAuthorizationStatus(AVMediaType.Video);
if (status == AVAuthorizationStatus.NotDetermined)
{
    AVCaptureDevice.RequestAccessForMediaType(AVMediaType.Video, granted =>
    {
        if (granted)
        {
            // 授权通过,执行相机初始化
            SetUp();
        }
    });
}
else if (status == AVAuthorizationStatus.Authorized)
{
    // 已有权限,直接初始化
    SetUp();
}

2. 代码中的致命错误:Handle属性无限递归

你当前实现的Handle属性:

public IntPtr Handle => this.Handle; //_session.Handle; 

属于典型的无限递归,只要有代码访问该属性就会直接触发栈溢出崩溃。请直接修改为注释中需要返回的会话句柄:

public IntPtr Handle => _session?.Handle ?? IntPtr.Zero;

3. 其他优化建议

  • 调用AVCaptureDeviceInput.FromDevice后需要校验返回值和输出的error参数,避免后续逻辑用到空对象
  • 建议先初始化AVCaptureSession,再依次配置输入、输出对象,符合苹果官方推荐的会话配置顺序
  • 后续给ConfigureComponents方法添加输入输出到会话的逻辑时,需要调用_session.BeginConfiguration()和_session.CommitConfiguration()包裹配置代码

内容的提问来源于stack exchange,提问作者canderse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:27:04