Media.Plugin в сочетании с Rg.Plugin: В iOS одновременно может быть активна только одна операция? - PullRequest
0 голосов
/ 14 марта 2019

У меня есть всплывающее окно, созданное с помощью Rg.Plugin.Popup.Pages:

public partial class DynamicPopup : PopupPage
    {
       public DynamicPopup(bool showCancellButton, params (string btnName, Action btnAction)[] btns)
    {
        InitializeComponent();
        stkCancel.IsVisible = showCancellButton;

        foreach (var btn in btns)
        {
            var stack = new StackLayout
            {
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Padding = new Thickness(0, 0, 0, 10)
            };

            stack.Children.Add(new CustomLabel
            {
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                VerticalOptions = LayoutOptions.CenterAndExpand,
                Text = btn.btnName,
                FontSize = 16,
                FontAttributes = FontAttributes.Bold
            });
            stack.GestureRecognizers.Add(new TapGestureRecognizer
            {
                Command = new Command(() =>
                {
                    btn.btnAction();
                    CloseAllPopup();
                })
            });

            stkParent.Children.Add(stack);             
            }
        }
    }
    }

Короче говоря, оно принимает массив кортежей (строка, действие) и создает всплывающие кнопки с противоположным текстом.и нажмите событие из кортежей.На другой странице я нажимаю на ярлык, который показывает DynamicPopup:

 lbImg.GestureRecognizers.Add(new TapGestureRecognizer { Command = new Command(async() =>await AddPicture_Tapped()) });

и открываю DynamicPopup в AddPicture_Tapped:

 private async Task AddPicture_Tapped()
    {
        var popup = new DynamicPopup(true, ("Take Picture", Utility.TakePic), ("Choose From Gallery", Utility.ChoosePic));
        await Application.Current.MainPage.Navigation.PushPopupAsync(popup);
    }

Utility.TakePic:

public async static void TakePic()
        {
            try
            {
                var cameraStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
                var storageStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);

                if (cameraStatus != PermissionStatus.Granted || storageStatus != PermissionStatus.Granted)
                {
                    var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Camera, Permission.Storage });
                    cameraStatus = results[Permission.Camera];
                    storageStatus = results[Permission.Storage];
                }

                if (cameraStatus != PermissionStatus.Granted && storageStatus != PermissionStatus.Granted)
                {
                    await App.Current.MainPage.DisplayAlert("Permissions Denied", "Unable to take photo", "OK");
                    return;
                }

                //await CrossMedia.Current.Initialize();
                if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
                {
                    await App.Current.MainPage.DisplayAlert("No Camera", ":( No camera available.", "OK");
                    return;
                }


                var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
                {
                    Directory = "ExpertsParteners",
                    Name = "Item_Pic.jpg",
                    PhotoSize = PhotoSize.Small,
                    DefaultCamera = CameraDevice.Rear
                });

                if (file == null)
                {
                    return;
                }

                ImageData = new ImageData
                {
                    FilePath = GetFileName(file.Path),
                    FileFullPath = file.Path,
                    FileBase64 = Convert.ToBase64String(ReadToEnd(file.GetStream()))
                };

                file.Dispose();
            }
            catch (MediaPermissionException ex)
            {
                await App.Current.MainPage.DisplayAlert("Permission required", ex.Message, "OK");
            }
            catch (Exception ex)
            {
                await App.Current.MainPage.DisplayAlert("Error - Take", ex.Message, "OK");
                Debug.WriteLine(ex);
            }
        }

но когда я нажимаю «Сделать снимок» во всплывающем окне, при первом открытии камеры на секунду и автоматическом закрытии, а когда я снова нажимаю «Сделать снимок», срабатывает исключение:

System.InvalidOperationException: Только одна операция может быть активной одновременно в Plugin.Media.MediaImplementation.GetMediaAsync (UIKit.UIImagePickerControllerSourceType sourceType, System.String mediaType, Plugin.Media.Abstractions.StoreCameraMediaOptions Options)Media.MediaImplementation + d__22.событие клика.

РЕДАКТИРОВАТЬ

Я создал новыйвсплывающее окно (со статическими элементами управления) и переместило в него два метода TakePic и ChoosePic, теперь оно работает правильно, но я все еще хочу использовать динамическое всплывающее окно и сохранить методы в классе Utility!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...