xamarin / Essentials

Xamarin.Essentials is no longer supported. Migrate your apps to .NET MAUI, which includes Maui.Essentials.
https://aka.ms/xamarin-upgrade
Other
1.53k stars 506 forks source link

[Bug] UWP Media Picker capture Photo doesn't work on windows 11 #2112

Open DaniRvd opened 7 months ago

DaniRvd commented 7 months ago

Description

OS : Windows 11 Enterprise OS build: 22621.2715 Starting with 2311 camera update, is not possible to take picture with Xamarin Essential Media Picker

Steps to Reproduce

  1. Open the sample app
  2. Press take Photo button
  3. Thy to capture a photo
  4. An error will be displayed

Expected Behavior

Actual Behavior

Basic Information

Second test Xamarin Forms: latest Xamarin Essentials: latest

Reproduction Link

XamarinEsenstialSample.zip

z0mero commented 7 months ago

Hello Sir, i also have the same problem but i didn't find a workaround for this issue yet. Please let me know if you find any solution!

denisdnl commented 7 months ago

I went into the same problem. Didn't find any solution.

DaniRvd commented 7 months ago

Manage pass over the issue described above. But now I have another issue on UWP when my app is running on Windows 11 platform. Because Did some debugging on the Xamarin Essentials sample code. and the issue is caused by the setting form picture bellow, because you cannot save the unstill you make some editing, and if you press the save a copy button then the image cannot be loaded to the app anymore. image

My question is if you can expose AllowCropping setting int the MediaPickerOptions this way the this setting can be disabled and MediaPicker will work again as expected.

This issue can be closed I'll open a new one and complete all the details needed

Maxgamerboy1 commented 6 months ago

Encountering this issue too, in regard to the cropper not allowing to save without editing, though i'm not seeing the code mentioned here

Manage pass over the issue described above. But now I have another issue on UWP when my app is running on Windows 11 platform. Because Did some debugging on the Xamarin Essentials sample code. and the issue is caused by the setting form picture bellow, because you cannot save the unstill you make some editing, and if you press the save a copy button then the image cannot be loaded to the app anymore. image

My question is if you can expose AllowCropping setting int the MediaPickerOptions this way the this setting can be disabled and MediaPicker will work again as expected.

This issue can be closed I'll open a new one and complete all the details needed

or is it the fact that AllowCropping is set to true by default? I believe this to be the line in question https://github.com/xamarin/Essentials/blob/ae2cb946f8215ff49fa20773ec824b317e6ca603/Xamarin.Essentials/MediaPicker/MediaPicker.uwp.cs#L54

DaniRvd commented 6 months ago

The issue is indeed the AllowCropping is set by default on true, this setting should be exposed and make it available to the developer. But seems nobody from Xamarin Essentials read this

gdougherty-cbt commented 5 months ago

Are there any updates on this? It seems like it should be a relatively simple fix to expose the property or disable clipping since it doesn't seem to work as a feature in that context in general.

gdougherty-cbt commented 5 months ago

For anyone that needs a workaround, adding this method to a helper on your UWP project and calling it via the dependency service works.

    public async Task<(FileResult, byte[])> CaptureAsync(MediaPickerOptions options, bool photo)
    {
        // This is largely taken from the following file to get around the following issue
        // https://github.com/xamarin/Essentials/blob/ae2cb946f8215ff49fa20773ec824b317e6ca603/Xamarin.Essentials/MediaPicker/MediaPicker.uwp.cs
        // https://github.com/xamarin/Essentials/issues/2112
        var captureUi = new CameraCaptureUI();

        if (photo)
        {
            captureUi.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg;
            captureUi.PhotoSettings.AllowCropping = false;
        }
        else
        {
            captureUi.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4;
        }

        var file = await captureUi.CaptureFileAsync(photo ? CameraCaptureUIMode.Photo : CameraCaptureUIMode.Video);
        // I'm not 100% sure why but assume it's related to local extension methods I don't have access to, but I cannot send the file as an argument to the file result.
        //      We still can use it's file name handling here, etc., but the OpenReadAsync on the FileResult object created below does not work.
        //      Pulling the full image early here lets us work around this issue.
        if (file != null)
        {
            using (var ms = new MemoryStream())
            {
                using (var s = await file.OpenReadAsync())
                {
                    s.AsStreamForRead().CopyTo(ms);
                    return (new FileResult(file.Path, file.ContentType), ms.ToArray());
                }
            }
        }

        return (null, null);
    }