Lance McCarthy
Lance McCarthy

Reputation: 1917

How to switch to Front Camera in Windows Phone 8.1 (WinRT/Jupiter)

I can't seem to find the property for the MediaCapture class that allows me to detect the front camera and switch to it if available. Here is my current setup of the device, it all works as expected on Windows (front cam) and Phone (rear cam). None of the Microsoft samples show the front camera being used in Universal or WP 8.1 (WinRT/Jupiter).

mediaCaptureManager = new MediaCapture();
            await mediaCaptureManager.InitializeAsync();

            if (mediaCaptureManager.MediaCaptureSettings.VideoDeviceId != "" && mediaCaptureManager.MediaCaptureSettings.AudioDeviceId != "")
            {
                StartStopRecordingButton.IsEnabled = true;
                TakePhotoButton.IsEnabled = true;

                ShowStatusMessage("device initialized successfully!");
                mediaCaptureManager.VideoDeviceController.PrimaryUse = CaptureUse.Video;
                mediaCaptureManager.SetPreviewRotation(VideoRotation.Clockwise90Degrees);
                mediaCaptureManager.SetRecordRotation(VideoRotation.Clockwise90Degrees);
                mediaCaptureManager.RecordLimitationExceeded += RecordLimitationExceeded;
                mediaCaptureManager.Failed += Failed;
            }

Upvotes: 0

Views: 2120

Answers (2)

Mike
Mike

Reputation: 2260

There is a sample on the Microsoft github page that is relevant, although they target Windows 10. Still, the APIs should work on 8/8.1.

UniversalCameraSample: This one does capture photos, and supports portrait and landscape orientations. Here is the relevant part:

private static async Task<DeviceInformation> FindCameraDeviceByPanelAsync(Windows.Devices.Enumeration.Panel desiredPanel)
{
    // Get available devices for capturing pictures
    var allVideoDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);

    // Get the desired camera by panel
    DeviceInformation desiredDevice = allVideoDevices.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == desiredPanel);

    // If there is no device mounted on the desired panel, return the first device found
    return desiredDevice ?? allVideoDevices.FirstOrDefault();
}

And you can use it like so:

// Attempt to get the front camera if one is available, but use any camera device if not
var cameraDevice = await FindCameraDeviceByPanelAsync(Windows.Devices.Enumeration.Panel.Front);

if (cameraDevice == null)
{
    Debug.WriteLine("No camera device found!");
    return;
}

// Create MediaCapture and its settings
_mediaCapture = new MediaCapture();

var settings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };

// Initialize MediaCapture
try
{
    await _mediaCapture.InitializeAsync(settings);
    _isInitialized = true;
}
catch (UnauthorizedAccessException)
{
    Debug.WriteLine("The app was denied access to the camera");
}
catch (Exception ex)
{
    Debug.WriteLine("Exception when initializing MediaCapture with {0}: {1}", cameraDevice.Id, ex.ToString());
}

Have a closer look at the sample to see how to get all the details. Or, to have a walkthrough, you can watch the camera session from the recent //build/ conference, which includes a little bit of a walkthrough through some camera samples.

Upvotes: 1

Lance McCarthy
Lance McCarthy

Reputation: 1917

Here is how to get the device's available cameras and set the front one for the stream:

                mediaCaptureManager = new MediaCapture();
            var devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
            var deviceInfo = devices[0]; //grab first result

            foreach (var device in devices)
            {
                if (device.Name.ToLowerInvariant().Contains("front"))
                {
                    deviceInfo = frontCamera = device;
                    hasFrontCamera = true;
                }
                if (device.Name.ToLowerInvariant().Contains("back"))
                {
                    rearCamera = device;
                }
            }

            var mediaSettings = new MediaCaptureInitializationSettings
            {
                MediaCategory = MediaCategory.Communications,
                StreamingCaptureMode = StreamingCaptureMode.AudioAndVideo,
                VideoDeviceId = deviceInfo.Id
            };

            await mediaCaptureManager.InitializeAsync(mediaSettings);

You'll need to consider rotation because front and rear cameras on different devices have different rotations, but this will initialize your MediaCapture properly

Upvotes: 1

Related Questions