【问题标题】:InvalidOperationException in PhotoCaptureDevice in WP8WP8 中 PhotoCaptureDevice 中的 InvalidOperationException
【发布时间】:2014-01-09 13:09:03
【问题描述】:

当我在 windows phone 8 相机应用程序中调用 await PhotoCaptureDevice.OpenAsync(..) 时会抛出 InvalidOperationException。

System.InvalidOperationException:操作无效,因为 对象的当前状态。在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 JPMC.Controls.CaptureTaskLauncher.d_6.MoveNext() --- 堆栈结束 从先前引发异常的位置跟踪 --- 在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.b_0(对象 州)}

但还有一件事是,当我第一次运行相机测试时,它会完美运行,即 PhotoCaptureDevice 已正确初始化,但是当我从另一个页面返回相机测试时,它会出现上述错误。 那么,谁能帮我解决这个问题?

谢谢

【问题讨论】:

    标签: windows-phone-8 camera


    【解决方案1】:

    您是否尝试过在离开页面之前使用 PhotoCaptureDevice.Close() 和 Dispose() 释放资源?

    【讨论】:

    • 是的,我试过了,但是没用。之后也会抛出异常。
    • 那么您将需要显示更多代码(或者我应该说 - 至少一些代码)来显示您如何初始化 PhotoCaptureDevice 等。
    【解决方案2】:
     private static PhotoCaptureDevice d = null;
            public static async Task<bool> InitializeCamera(CameraSensorLocation sensorLocation)
            {
                bool catchValue = true;
                try
                {
                    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);
                    d = await PhotoCaptureDevice.OpenAsync(sensorLocation, initialResolution);
                    await d.SetPreviewResolutionAsync(previewResolution);
                    await d.SetCaptureResolutionAsync(captureResolution);               
                    d.SetProperty(KnownCameraGeneralProperties.PlayShutterSoundOnCapture, true);
                    MemoryStream stream = new MemoryStream();                
                    CameraCaptureSequence sequence = d.CreateCaptureSequence(1);
                    sequence.Frames[0].CaptureStream = stream.AsOutputStream();
                    await d.PrepareCaptureSequenceAsync(sequence);                
                    await sequence.StartCaptureAsync();                            
                    if (stream.Length > 0)
                    {
                        d.Dispose();
                        d = null;
                        stream.Dispose();
                        stream = null;
                        return true;
                    }
                    else
                    {
                        d.Dispose();
                        d = null;
                        stream.Dispose();
                        stream = null;
                    }
                    return false;
                }
                catch (Exception ex)
                {
                    catchValue = false;
                }
                if (!catchValue)
                {
                    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);
    
                     d = await PhotoCaptureDevice.OpenAsync(sensorLocation,initialResolution);
    
                    await d.SetPreviewResolutionAsync(previewResolution);
                    await d.SetCaptureResolutionAsync(captureResolution);
    
                    d.SetProperty(KnownCameraGeneralProperties.PlayShutterSoundOnCapture, true);
                    MemoryStream stream = new MemoryStream();
    
                    CameraCaptureSequence sequence = d.CreateCaptureSequence(1);
                    sequence.Frames[0].CaptureStream = stream.AsOutputStream();
                    await d.PrepareCaptureSequenceAsync(sequence);
    
                    await sequence.StartCaptureAsync();
    
                    if (stream.Length > 0)
                    {
                        d.Dispose();
                        d = null;
                        stream.Dispose();
                        stream = null;
                        return true;
                    }
                    else
                    {
                        d.Dispose();
                        d = null;
                        stream.Dispose();
                        stream = null;
                    }
                    return false;
                }
                return false;
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多