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

如何在.NET MAUI中使用Camera.Maui的AutoSnapShot功能?

问题描述

我正在开发目标Android API 32的.NET 7 MAUI应用(目前仅在Android测试),尝试通过定时器实现拍照功能。发现所用Camera.Maui NuGet插件的AutoSnapShot功能可解决我遇到的Task.Delay相关问题,但该功能缺乏详细使用文档。
我已设置AutoSnapShotFormat、AutoSnapShotSeconds、AutoSnapShotAsImageSource、TakeAutoSnapShot等相关属性,但功能未生效,既未看到闪光灯触发,也未捕获到SnapShotStream的属性变更事件(仅能捕获AutoSnapShot相关属性的变更)。
请问是否需要开启线程轮询camera.SnapShotStream来获取新图像?还有哪些我遗漏的操作或需要调整的地方?

代码片段

MainPage.xaml.cs 调用代码

private CameraCapture capture = new();

private async Task<bool> StartCapture()
{
    try 
    {
        ...
        capture.StartTimer(quantity, timerDelay);
        ...
    }
    catch
    {
        return false;
    }

    return true;
}

CameraCapture类相关代码

private readonly CameraView camera;
private int pictureQuantity = 0;

public CameraCapture(CameraView cameraView)
{
    camera = cameraView;
}

public void StartTimer(int quantity, int timerDelay)
{
    pictureQuantity = quantity;

    camera.PropertyChanged -= Camera_PropertyChanged;
    camera.PropertyChanged += Camera_PropertyChanged;
    camera.AutoSnapShotFormat = AppPreferences.Settings.Filetype;
    camera.AutoSnapShotSeconds = timerDelay / 1000;
    camera.AutoSnapShotAsImageSource = true;
    camera.TakeAutoSnapShot = true;
}

private void Camera_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    // e.PropertyName ends up being stuff like "AutoSnapShotFormat" and "AutoSnapShotSeconds ", 
    // but never "SnapShotStream".
    if (e.PropertyName == nameof(camera.SnapShotStream))
    {
        Stream stream = camera.SnapShotStream;
        // Send "stream" to another method to handle the image being captured
        autosnapshotCount++;

        if (autosnapshotCount >= pictureQuantity)
        {
            autosnapshotCount = 0;
            camera.TakeAutoSnapShot = false;
        }
    }
}
解决方案

1. 确认相机初始化与权限

  • 确保CameraView已在XAML中正确声明,并且调用过camera.StartCameraAsync()完成启动——AutoSnapShot功能依赖相机处于激活状态。
  • 检查应用是否已获取相机权限和必要的存储权限,Android API 32需要在Manifest中声明权限,并在运行时主动请求。

2. 替换监听方式,改用快照事件

Camera.Maui的AutoSnapShot功能通常不会触发SnapShotStream的PropertyChanged事件,而是通过专门的SnapShotTaken事件回调快照结果。修改监听逻辑:

// 替换PropertyChanged事件绑定为SnapShotTaken事件
public void StartTimer(int quantity, int timerDelay)
{
    pictureQuantity = quantity;

    camera.SnapShotTaken -= Camera_SnapShotTaken;
    camera.SnapShotTaken += Camera_SnapShotTaken;
    
    camera.AutoSnapShotFormat = AppPreferences.Settings.Filetype;
    camera.AutoSnapShotSeconds = timerDelay / 1000;
    camera.AutoSnapShotAsImageSource = false;
    camera.TakeAutoSnapShot = true;
}

// 快照回调处理
private void Camera_SnapShotTaken(object sender, SnapShotEventArgs e)
{
    Stream stream = e.Stream;
    // 处理图像逻辑
    autosnapshotCount++;

    if (autosnapshotCount >= pictureQuantity)
    {
        autosnapshotCount = 0;
        camera.TakeAutoSnapShot = false;
        camera.SnapShotTaken -= Camera_SnapShotTaken;
    }
}

3. 无需轮询,优先事件驱动

不需要开启线程轮询SnapShotStream,轮询会占用额外资源且可靠性低。如果插件未提供SnapShotTaken事件,可检查是否有AutoSnapShotCompleted等同类回调接口。

4. 参数配置细节调整

  • 确认AutoSnapShotSeconds的值大于0,插件通常不支持0秒间隔的自动快照。
  • 验证AutoSnapShotFormat是插件支持的格式(如Jpeg、Png),确保AppPreferences.Settings.Filetype的取值符合插件要求。
  • 尝试将AutoSnapShotAsImageSource设为false,该属性为true时,插件可能仅更新ImageSource对象,不会生成SnapShotStream。

5. 前置相机状态检查

在开启自动快照前,确保相机已成功启动:

public async void StartTimer(int quantity, int timerDelay)
{
    pictureQuantity = quantity;

    if (!camera.IsCameraStarted)
    {
        await camera.StartCameraAsync();
    }

    // 后续属性设置与事件绑定逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:35:38