Windows Phone 8.1 | Iniciar cámara para previsualización

posterSupongamos que estamos realizando una aplicació y necesitamos ver lo que estamos enfocando con la cámara ya sea para iniciar una grabación, tomar una foto o simplemente, como en mi caso para hacer una linterna con cámara (Torch8). Dado que ya tenemos disponible el desarrollo para Windows 10 (desktop y mobile) la información escasea acerca de esta temática para la plataforma Windows Phone 8.1 y Windows 8.1, así que he recopilado lo que he encontrado al respecto y os lo condensaré en este artículo.

Seleccionar cámara

Para empezar, debemos seleccionar la cámara del dispositivo dado que podemos tener delantera, trasera o las dos.

// Get all the cameras
DeviceInformationCollection cameras = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);

// Selecting frotal camera
DeviceInformation frontCam = (from webcam in cameras
                              where webcam.EnclosureLocation != null
                              && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front
                              select webcam).FirstOrDefault();

// Selecting rear camera
DeviceInformation rearCam = (from webcam in cameras
                                where webcam.EnclosureLocation != null
                                && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
                                select webcam).FirstOrDefault();

 

Inicializar parámetros de captura

Una vez tengamos la cámara deseada, tendremos que inicializar la captura de vídeo con los parámetros que necesitemos como por ejemplo el código que muestro a continuación

// Initialize MediaCapture parameters
await mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings
{
    VideoDeviceId = rearCam.Id, // Using rear camera
    AudioDeviceId = "", // Don’t capture audio
    StreamingCaptureMode = StreamingCaptureMode.Video, // We want to capture video
    PhotoCaptureSource = PhotoCaptureSource.VideoPreview // Capture mode (Auto | Photo | VideoPreview)

});

Comenzar a obtener visualización de la cámara

Llegados a este punto, ya podemos visualizar lo que enfoquemos con la cámara en nuestro dispositivo y, para ello necesitamos tener preparado el control en la vista XAML y referenciarlo desde el código C#

XAML

<CaptureElement Name="PreviewControl"
                Stretch="UniformToFill"
                />

C#

// Set primary use as Video.

mediaCapture.VideoDeviceController.PrimaryUse = Windows.Media.Devices.CaptureUse.Video;

// Set the source of the CaptureElement to your MediaCapture
PreviewControl.Source = mediaCapture;

// Start Preview of Video.

await mediaCapture.StartPreviewAsync();

Más información

Toda esta información y podéis encontrarla con mayor profundidad en este enlace de MSDN 

Nota Importante

Debeis recordar que es absolutamente necesario liberar los recursos de la cámara al cerrar/suspender la aplicación ya que si no, puede haber conflictos con otras aplicaciones e incluso la nuestra no funcionará como esperamos, para ello, en el enlace que os he puesto tenéis a vuestra dispocisión una muestra de código para limpiar los recursos

public async Task CleanupCaptureResources()
{
    if (IsRecording && MediaCapture != null)
    {
        await MediaCapture.StopRecordAsync();
        IsRecording = false;
    }
    if (IsPreviewing && MediaCapture != null)
    {
        await MediaCapture.StopPreviewAsync();
        IsPreviewing = false;
    }

    if (MediaCapture != null)
    {
        if (PreviewElement != null)
        {
            PreviewElement.Source = null;
        }
        MediaCapture.Dispose();
    }
}

Esta limpieza debéis llevarla a cabo al menos al suspender la aplicación tal y como os copio y pego de la documentación

private async void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();

    //cleanup camera resources
    await CleanupCaptureResources();

    deferral.Complete();
}

No obstante debéis consultar en profundidad la documentación acerca de los estados y el ciclo de vida de las aplicaciones Windows Phone 8.1 o incluso estudiar la posibilidad de manejar la suspensión en la vista tal y como se explica en este artículo de MSDN.

 

Espero que os sea de ayuda. Enjoy coding!!!