PhotoCapture设备没有显示任何内容

时间:2012-12-05 08:32:15

标签: c# xaml camera windows-phone-8

我使用以下代码使用Windows Phone 8中的PhotoCaptureDevice选项拍摄快照。

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;
            }

最后,我将此设备设置为视频画笔的源。但是,当应用程序通过按住后退键进入此状态时,我来自休眠状态,它显示空白页面并且不显示任何相机。你能帮助我吗?

1 个答案:

答案 0 :(得分:3)

诺基亚拥有WP8的PhotoCaptureDevice中启用的众多功能的优秀示例应用程序。查看@ http://projects.developer.nokia.com/cameraexplorer

甚至还有一个在第一页上使用PhotoCaptureDevice作为VideoBrush.SetSource()的端到端示例。从MainPage.xaml.cs上的OnNavigatedTo方法开始,了解如何使用PhotoCaptureDevice初始化Camera Viewfinder @ http://projects.developer.nokia.com/cameraexplorer/browser/CameraExplorer/MainPage.xaml.cs

以下是相关部分:

    /// <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;
    }

相关的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>