Search code examples
c#camerawindows-phone-8.1video-capturefront-camera

Trying to use back camera followed by front camera c# mediacapture windows phone 8.1


I am writing a program where I want to take pic from back camera and then front camera using a single button. First it takes pic using back camera with no issue. but I try takin pic using front camera, it gives me exception saying like "No error text found associated with this error code" at await newFrontCapture.StartPreviewAsync(); line where newFrontCapture is the object of MediaCapture. Following is the code I am trying:

//code to take back camera image
  webcamList = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);

            backWebcam = (from webcam in webcamList 
    where webcam.EnclosureLocation != null
                          && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
                          select webcam).FirstOrDefault();


  MediaCapture newCapture = null;
        DeviceInformationCollection webcamList;
        const string filename = "mysetting.txt";
        StorageFolder sf = null;
        DeviceInformation backWebcam;

  try
            {
                if (newCapture!= null)
                    newCapture.Dispose();
                newCapture = new MediaCapture();
                await newCapture.InitializeAsync(new MediaCaptureInitializationSettings()
                {
                    VideoDeviceId = backWebcam.Id                    

                });
                cp.Source = newCapture;
                          // Start the preview
                await newCapture.StartPreviewAsync();
            }

            catch (Exception ex)
            {
                newCapture.Dispose();
            }


   StorageFolder folder = ApplicationData.Current.LocalFolder;
                var picPath = "Image_Test_" + Convert.ToString(new Random());
                StorageFile captureFile = await folder.CreateFileAsync(picPath, CreationCollisionOption.GenerateUniqueName);
                ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();                
                //Capture your picture into the given storage file
                await newCapture.CapturePhotoToStorageFileAsync(imageProperties, captureFile);
                BitmapImage bitmapToShow = new BitmapImage(new Uri(captureFile.Path));
                imagePreivew.Source = bitmapToShow;  // show image on screen inside Image 
                captureFile = null;

                await newCapture.StopPreviewAsync();
                newCapture.Dispose();

                Frame.Navigate(typeof(FrontImagePage),imagePreivew);

            }
            catch (Exception ex)
            {

                printvlaue.Text = ex.Message;

                await newCapture.StopPreviewAsync();

                newCapture.Dispose();// disposing the object of mediacapture (back camera object)

            }

// Code to take front camera pic
  try
            {


                webcamList = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
                frontWebCam = (from webcam in webcamList
                               where webcam.EnclosureLocation != null
                               && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front
                               select webcam).FirstOrDefault();
                newFrontCapture = new MediaCapture();

                await newFrontCapture.InitializeAsync(new MediaCaptureInitializationSettings()
                {
                    VideoDeviceId = frontWebCam.Id,
                    PhotoCaptureSource = PhotoCaptureSource.Photo,
                     StreamingCaptureMode=StreamingCaptureMode.Video
                });

                //await newFrontCapture.InitializeAsync(new MediaCaptureInitializationSettings()
                //{
                //    VideoDeviceId = frontWebCam.Id,
                //    PhotoCaptureSource = PhotoCaptureSource.Photo
                //});


                await newFrontCapture.StartPreviewAsync();


                StorageFolder folder = ApplicationData.Current.LocalFolder;

                var picFront = "Image_Test_Front" + Convert.ToString(new Random());


                StorageFile captureFrontFile = await folder.CreateFileAsync(picFront, CreationCollisionOption.GenerateUniqueName);


                ImageEncodingProperties imageFrontProperties = ImageEncodingProperties.CreateJpeg();
                //Capture your picture into the given storage file

                await newFrontCapture.CapturePhotoToStorageFileAsync(imageFrontProperties, captureFrontFile);


                BitmapImage bitmapToShowFront = new BitmapImage(new Uri(captureFrontFile.Path));

                imageFront.Source = bitmapToShowFront;
                newFrontCapture.Dispose();
                newFrontCapture = null;
                imageBack.Source = this.im_.Source;
            }
            catch (Exception ex)
            {
              await  newFrontCapture.StopPreviewAsync();
                newFrontCapture.Dispose();


                //throw;
            }

Solution

  • Below code is working. it captures both font and back pictures in one click.

    private async Task CaptureBackAndFront()
    {  
    //front Camera capture...
            DeviceInformationCollection webcamList;
            webcamList = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
    
            DeviceInformation backWebcam;
            backWebcam = (from webcam in webcamList
                          where webcam.EnclosureLocation != null && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
                          select webcam).FirstOrDefault();
    
            MediaCapture newCapture = new MediaCapture();
            StorageFolder folder = ApplicationData.Current.LocalFolder;
            try
            {
                await newCapture.InitializeAsync(new MediaCaptureInitializationSettings()
                {
                    VideoDeviceId = backWebcam.Id
                });
                cp.Source = newCapture;
                await newCapture.StartPreviewAsync();
    
                var picPath = "Image_Test_" + Convert.ToString(new Random());
                StorageFile captureFile = await folder.CreateFileAsync(picPath, CreationCollisionOption.GenerateUniqueName);
                ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();
                //Capture your picture into the given storage file
                await newCapture.CapturePhotoToStorageFileAsync(imageProperties, captureFile);
                BitmapImage bitmapToShow = new BitmapImage(new Uri(captureFile.Path));
                imagePreivew.Source = bitmapToShow;  // show image on screen inside Image 
                captureFile = null;
            }
            catch (Exception ex)
            {
                //handel error situation...
            }
            finally
            {
                await newCapture.StopPreviewAsync();
                newCapture.Dispose();
            }
    
            // Code to take front camera pic
            MediaCapture newFrontCapture = new MediaCapture();
            try
            {
                var frontWebCam = (from webcam in webcamList
                                   where webcam.EnclosureLocation != null
                                   && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front
                                   select webcam).FirstOrDefault();
    
                await newFrontCapture.InitializeAsync(new MediaCaptureInitializationSettings()
                {
                    VideoDeviceId = frontWebCam.Id,
                });
    
                cp.Source = newFrontCapture;
    
                await newFrontCapture.StartPreviewAsync();
    
                var picFront = "Image_Test_Front" + Convert.ToString(new Random());               
                StorageFile captureFrontFile = await folder.CreateFileAsync(picFront, CreationCollisionOption.GenerateUniqueName);
                ImageEncodingProperties imageFrontProperties = ImageEncodingProperties.CreateJpeg();
                //Capture your picture into the given storage file
                await newFrontCapture.CapturePhotoToStorageFileAsync(imageFrontProperties, captureFrontFile);
                BitmapImage bitmapToShowFront = new BitmapImage(new Uri(captureFrontFile.Path));
    
                imagePreivew1.Source = bitmapToShowFront;
            }
            catch (Exception ex)
            {
                // Hanel error situation...
            }
            finally
            {
                await newFrontCapture.StopPreviewAsync();
                newFrontCapture.Dispose();
                newFrontCapture = null;
            }
        }
    }
    

    Hope this helps