user3010713
user3010713

Reputation: 31

UIImagePickerController is showing last clicked image. I am using Monotouch/Xamarin Studio

In my project, when I launch camera first time it works fine. when I launch camera second time, I see image last clicked in view finder. I am not sure what's causing this.

Can anyone please help me here?

following is code block to launch camera:

        UIImagePickerController imagePicker = new UIImagePickerController();
        // Handle media selected.
        var documentsDirectory = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
        imagePicker.FinishedPickingMedia += (sender, e) => {
            UIImage image = (UIImage)e.Info.ObjectForKey(
                new NSString("UIImagePickerControllerOriginalImage"));

            if (image != null)
            {
                this.InvokeOnMainThread(() => {
                    this.clickedImage.Image = image;
                    image.SaveToPhotosAlbum(delegate(UIImage img, NSError err){ 
                    });
                    string pngFilename = System.IO.Path.Combine (documentsDirectory, "Photo.png"); // hardcoded filename, overwrites each time
                    NSData imgData = image.AsPNG();
                    NSError SaveErr = null;
                    if (imgData.Save(pngFilename, false, out SaveErr))
                    {
                        Console.WriteLine("saved as " + pngFilename);
                    } else {
                        Console.WriteLine("NOT saved as" + pngFilename + " because" + SaveErr.LocalizedDescription);
                    }
                });
            }

            DismissViewController(true,null);

        };

        // Handle cancellation of picker.
        imagePicker.Canceled += (sender, e) => {
            DismissViewController(true,null);

        };



        btnCameraDisplay1.SetTitle("Take Picture", UIControlState.Normal);
        btnCameraDisplay1.Font = UIFont.SystemFontOfSize(19);
        btnCameraDisplay1.SetTitleColor(UIColor.Black, UIControlState.Normal);

        btnCameraDisplay1.TouchUpInside += delegate(object sender, EventArgs e)
        {
            if(UIImagePickerController.IsSourceTypeAvailable(UIImagePickerControllerSourceType.Camera))
            {
                imagePicker.SourceType = UIImagePickerControllerSourceType.Camera;
                imagePicker.AllowsEditing = false;
                this.PresentViewController(imagePicker, true,null);
            }
            else{
                alertView = new UIAlertView();
                alertView.AddButton("OK");
                alertView.Message = "No camera available in this device.";
                alertView.AlertViewStyle = UIAlertViewStyle.Default;
                alertView.Show();
            }
        };

Upvotes: 2

Views: 2009

Answers (1)

schmidiii
schmidiii

Reputation: 316

I ran into the same Problem. Some searching here on Stackoverflow helped:

Solution: Switch from the Event System to Delegates as explained here: https://stackoverflow.com/a/20035698/383658

So basically move your code from:

imagePicker.FinishedPickingMedia += (sender, e) => {}

to your new UIImagePickerControllerDelegate delegates method:

public override void FinishedPickingMedia (UIImagePickerController picker, NSDictionary info)
    {}

Upvotes: 2

Related Questions