【问题标题】:.NET MAUI Media Picker for Windows return null.NET MAUI Media Picker for Windows 返回 null
【发布时间】:2022-12-06 01:05:22
【问题描述】:

我使用 MS 文档从适用于 android 的相机捕获图像,但 Windows 始终返回 null,它也不会打开相机。有没有人能让它工作?

https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/device-media/picker?tabs=windows

【问题讨论】:

  • 发帖前请阅读How to Ask。您的帖子不包含任何说明您在做什么的代码

标签: .net windows media picker maui


【解决方案1】:

目前这是 .NET MAUI https://github.com/dotnet/maui/issues/7660 中的错误,最终是 WinUI 中的错误:https://github.com/microsoft/WindowsAppSDK/issues/1034

我们正在努力修复它!

同时,如果您自己实现一些代码,则有一个解决方法:

using Windows.Foundation.Collections;
using Windows.Media.Capture;
using Windows.Storage;
using Windows.System;
using Microsoft.Maui.Platform;
using WinRT.Interop;

public class CameraCaptureUI
{
    private LauncherOptions _launcherOptions;

    public CameraCaptureUI(MediaPickerOptions options)
    {
        var hndl = WindowStateManager.Default.GetActiveWindow().GetWindowHandle();

        _launcherOptions = new LauncherOptions();
        InitializeWithWindow.Initialize(_launcherOptions, hndl);

        _launcherOptions.TreatAsUntrusted                   = false;
        _launcherOptions.DisplayApplicationPicker           = false;
        _launcherOptions.TargetApplicationPackageFamilyName = "Microsoft.WindowsCamera_8wekyb3d8bbwe";
    }

        public async Task<StorageFile> CaptureFileAsync(CameraCaptureUIMode mode)
{
        var extension = mode == CameraCaptureUIMode.Photo ? ".jpg" : ".mp4";

        var currentAppData = ApplicationData.Current;
        var tempLocation = currentAppData.LocalCacheFolder;
        var tempFileName = $"CCapture{extension}";
        var tempFile = await tempLocation.CreateFileAsync(tempFileName, CreationCollisionOption.GenerateUniqueName);
        var token = Windows.ApplicationModel.DataTransfer.SharedStorageAccessManager.AddFile(tempFile);

        var set = new ValueSet();
        if (mode == CameraCaptureUIMode.Photo)
        {
            set.Add("MediaType", "photo");
            set.Add("PhotoFileToken", token);
        }
        else
        {
            set.Add("MediaType", "video");
            set.Add("VideoFileToken", token);
        }

        var uri = new Uri("microsoft.windows.camera.picker:");
        var result = await Windows.System.Launcher.LaunchUriForResultsAsync(uri, _launcherOptions, set);
        if (result.Status == LaunchUriStatus.Success && result.Result != null)
        {
            return tempFile;
        }

        return null;
    }
}

并像这样使用它:

public async Task<FileResult> CaptureAsync(MediaPickerOptions options, bool photo)
{
    var captureUi = new CameraCaptureUI(options);

    var file = await captureUi.CaptureFileAsync(photo ? CameraCaptureUIMode.Photo : CameraCaptureUIMode.Video);

    if (file != null)
        return new FileResult(file.Path,file.ContentType);

    return null;
}

【讨论】:

  • 谢谢 Gerald,非常感谢您帮助实施此代码!
  • 杰拉德,您可以制作视频吗?
  • 你有什么想不通的?
  • 不幸的是,这是行不通的。结果始终是未知的,使用您答案中的确切代码。
【解决方案2】:

我在我的应用程序中使用了此变通方法,并且效果很好。它包括一个示例应用程序来展示它是如何集成的。

https://github.com/richardrigutins/maui-sample-windows-camera-workaround

您基本上可以在每个 Platforms 文件夹中获取 CustomMediaPicker 文件,并将它们复制到相应的文件夹中。您可能想要更改每个文件中的 using 命名空间。您还需要复制 CustomMediaPicker.cs,它具有部分类 CustomMediaPicker : IMediaPicker 并且在您的应用中使用而不是 MediaPicker.Default。当您想在以前使用 MediaPicker.Default 的地方使用 CustomMediaPicker 时。

私有只读 IMediaPicker _mediaPicker = new CustomMediaPicker();

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 2022-10-18
    • 2023-02-10
    • 2017-03-21
    • 2023-03-20
    • 2012-10-14
    • 1970-01-01
    • 2017-11-06
    • 2016-02-25
    相关资源
    最近更新 更多