0

バーコードスキャンを使用してWP7/8アプリケーションに取り組んでいます。そして、カメラの処分に問題があります。カメラの初期化に時間がかかりすぎて、カメラがまだ初期化されていないときに [戻る] ボタンを押すと、致命的なエラーが発生しました:

タイプ 'System.ObjectDisposedException' の初回例外が Microsoft.Devices.Camera.ni.dll WinRT 情報で発生しました: 致命的なエラー。キャプチャ デバイスを破棄します。

このエラーを回避する方法を教えてください。

私のコード:

 protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        InitializeAndGo();

        base.OnNavigatedTo(e);
    }

    protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
    {
        disposeCamera();
    }

    private void PhotoCameraOnInitialized(object sender, CameraOperationCompletedEventArgs cameraOperationCompletedEventArgs)
    {
        _width = Convert.ToInt32(_photoCamera.PreviewResolution.Width);
        _height = Convert.ToInt32(_photoCamera.PreviewResolution.Height);

        _luminance = new PhotoCameraLuminanceSource(_width, _height);

        if (_photoCamera.IsFlashModeSupported(FlashMode.Auto))
        {
            _photoCamera.FlashMode = FlashMode.Off;
        }

        cameraInitialized = true;
        Dispatcher.BeginInvoke(() =>
        {
            FlashCheckbox.IsEnabled = true;
            if (_photoCamera.IsFlashModeSupported(FlashMode.Auto))
            {
                _photoCamera.FlashMode = FlashMode.Off;
            }
        });


        _photoCamera.Focus();
    }

     private void InitializeAndGo()
        {
             stopScan = false;
            _photoCamera = new PhotoCamera();
            _photoCamera.Initialized += PhotoCameraOnInitialized;
            _photoCamera.AutoFocusCompleted += PhotoCameraOnAutoFocusCompleted;
            viewfinderBrush.SetSource(_photoCamera);
            _previewTransform.Rotation = _photoCamera.Orientation;
            _results = new ObservableCollection<Result>();

            _barcodeReader = new BarcodeReader();
            _barcodeReader.TryHarder = true;
            _barcodeReader.AutoRotate = true;              
            _service = new MyMoviesDataService(ErrorDataService);

        }

    private void disposeCamera()
    {
        try
        {
            cameraInitialized = false;
            StopScan();
            _photoCamera.Initialized -= PhotoCameraOnInitialized;
            _photoCamera.AutoFocusCompleted -= PhotoCameraOnAutoFocusCompleted;
            _photoCamera.Dispose();
            _photoCamera = null;
        }
        catch (Exception ex)
        {
            App.ShowErrorToast(ex.Message);
        }
    }
4

2 に答える 2

1

カメラが正常に初期化されるまで使用しないでください (これは、カメラの Initialized イベントで確認できます)。

また、カメラの使用法を

try
{
    // camera code here
}
catch (ObjectDisposedException)
{
    // re-initialize the camera?
}

カメラを自動的に処分するサスペンションなどの状況を処理します。

に関しては

タイプ 'System.ObjectDisposedException' の例外が Microsoft.Devices.Camera.ni.dll で発生し、マネージド/ネイティブ境界の前に処理されませんでした WinRT 情報: 致命的なエラー。キャプチャ デバイスを破棄します。

これは、Microsoft が修正する必要があるものです。つまり、マネージ コードへの伝播が許可されていない場合、ネイティブ コードの例外をどのように処理するのでしょうか?

于 2014-03-07T09:23:47.390 に答える
0

例外はどこから発生していますか (どのコード行/ブロック)?

まず、OnNavigatedTo イベント ハンドラーの InitializeAndGo() に try...catch を配置します。また、PhotoCameraOnInitialized イベント ハンドラ全体でも同様です。

乾杯、

于 2013-08-22T08:55:45.470 に答える