David Bekham
David Bekham

Reputation: 2175

PhotoCapture device does not show anything

I use the following code to take the snap using the PhotoCaptureDevice option in Windows Phone 8.

if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back) ||
                PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Front))
            {
                // Initialize the camera, when available.
                if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back))
                {
                    // Use the back camera.
                    System.Collections.Generic.IReadOnlyList<Windows.Foundation.Size> SupportedResolutions =
                        PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back);
                    Windows.Foundation.Size res = SupportedResolutions[0];
                    d = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, res);
                }
                else
                {
                    // Otherwise, use the front camera.
                    System.Collections.Generic.IReadOnlyList<Windows.Foundation.Size> SupportedResolutions =
                        PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Front);
                    Windows.Foundation.Size res = SupportedResolutions[0];
                    d = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Front, res);
                }

                await d.SetPreviewResolutionAsync(new Windows.Foundation.Size(640, 480));
                await d.SetCaptureResolutionAsync(new Windows.Foundation.Size(640, 480));

                d.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation,
                              d.SensorLocation == CameraSensorLocation.Back ?
                              d.SensorRotationInDegrees : -d.SensorRotationInDegrees);

                _device = d;
            }

Finally i set this device to the Source of the Video brush. But i come from the dormant state when the application goes to this state by press and hold of back key, it shows the empty page and does not display any camera. Could you please anyone help me on this ?

Upvotes: 1

Views: 1783

Answers (1)

JustinAngel
JustinAngel

Reputation: 16102

Nokia has a great sample app of the many capabilities enabled in WP8's PhotoCaptureDevice. Check it out @ http://projects.developer.nokia.com/cameraexplorer

There's even an end-to-end example of using PhotoCaptureDevice as the VideoBrush.SetSource() right on the first page. Start from OnNavigatedTo method on MainPage.xaml.cs to see how to initialize a Camera Viewfinder with PhotoCaptureDevice @ http://projects.developer.nokia.com/cameraexplorer/browser/CameraExplorer/MainPage.xaml.cs

Here are the relevant parts:

    /// <summary>
    /// If camera has not been initialized when navigating to this page, initialization
    /// will be started asynchronously in this method. Once initialization has been
    /// completed the camera will be set as a source to the VideoBrush element
    /// declared in XAML. On-screen controls are enabled when camera has been initialized.
    /// </summary>
    protected async override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (_dataContext.Device == null)
        {
            ShowProgress("Initializing camera...");

            await InitializeCamera(CameraSensorLocation.Back);

            HideProgress();
        }

        videoBrush.RelativeTransform = new CompositeTransform()
        {
            CenterX = 0.5,
            CenterY = 0.5,
            Rotation = _dataContext.Device.SensorLocation == CameraSensorLocation.Back ?
                       _dataContext.Device.SensorRotationInDegrees :
                     - _dataContext.Device.SensorRotationInDegrees
        };

        videoBrush.SetSource(_dataContext.Device);

        overlayComboBox.Opacity = 1;

        SetScreenButtonsEnabled(true);
        SetCameraButtonsEnabled(true);

        base.OnNavigatedTo(e);
    }

    /// <summary>
    /// Initializes camera. Once initialized the instance is set to the DataContext.Device property
    /// for further usage from this or other pages.
    /// </summary>
    /// <param name="sensorLocation">Camera sensor to initialize</param>
    private async Task InitializeCamera(CameraSensorLocation sensorLocation)
    {
        Windows.Foundation.Size initialResolution = new Windows.Foundation.Size(640, 480);
        Windows.Foundation.Size previewResolution = new Windows.Foundation.Size(640, 480);
        Windows.Foundation.Size captureResolution = new Windows.Foundation.Size(640, 480);

        PhotoCaptureDevice d = await PhotoCaptureDevice.OpenAsync(sensorLocation, initialResolution);

        await d.SetPreviewResolutionAsync(previewResolution);
        await d.SetCaptureResolutionAsync(captureResolution);

        d.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation,
                      d.SensorLocation == CameraSensorLocation.Back ?
                      d.SensorRotationInDegrees : - d.SensorRotationInDegrees);

        _dataContext.Device = d;
    }

And relevant XAML:

        <Canvas x:Name="VideoCanvas">
            <Canvas.Background>
                <VideoBrush x:Name="videoBrush"/>
            </Canvas.Background>
            <Rectangle x:Name="FocusIndicator" Stroke='Red' Opacity="0.7" Width="80" Height="80" StrokeThickness="5" Visibility="Collapsed"/>
        </Canvas>

Upvotes: 3

Related Questions