2017-04-26 3 views
0

Suis-je en train d'ouvrir la caméra pour prendre une photo, mais l'utilisateur a la possibilité d'arrêter la caméra s'il ne veut plus capturer quelque chose, alors j'ai un bouton de fermeture qui destiné à fermer la caméra, de sorte que l'aperçu de la caméra doit être arrêté.L'appareil d'enregistrement vidéo est préempté par une autre application immersive

Si j'ouvre la caméra, fermer, ouvrir à nouveau, je vais faire l'exception suivante une fois que le bouton de fermeture est cliqué pour la deuxième fois:

System.Runtime.InteropServices.COMException: 'The video recording device is preempted by another immersive application. 

Je ne sais pas, comment la caméra de prévisualisation devrait être arrêté, plus de UWP docs dit ici: https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/simple-camera-preview-access

le code pour arrêter l'aperçu de la caméra:

private async Task CleanupCameraAsync() 
    { 
     if (_mediaCapture != null) 
     { 
      if (_isPreviewing) 
      { 
       await _mediaCapture.StopPreviewAsync(); 
      } 

      await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       CameraPreviewControl.Source = null; 
       if (_displayRequest != null) 
       { 
        _displayRequest.RequestRelease(); 
       } 

       _mediaCapture.Dispose(); 
      }); 
     } 
    } 

Répondre

0

J'ai essayé de tester l'extrait de code de mon côté et ça peut bien fonctionner. Je n'ai pas eu l'exception ci-dessus. J'ai testé sur l'émulateur build 15063 et build 14393. Comme votre extrait de code n'est pas le code complété, j'ai donc créé un projet minimal de test comme suit qui peut bien fonctionner de mon côté. Vous pouvez le tester de votre côté et comparer avec votre code si quelque chose ne va pas avec votre projet.

XAML

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="30"> 
    <CaptureElement Name="PreviewControl" Stretch="Uniform"/> 
    <Button x:Name="btnpreview" Click="btnpreview_Click" Content="preview test"></Button> 
    <Button x:Name="btnstop" Click="btnstop_Click" Content="stop"></Button> 
</StackPanel> 

code derrière

private DeviceInformation _cameraDevice; 
private MediaCapture _mediaCapture; 
private InMemoryRandomAccessStream _ras; 
private LowLagMediaRecording _recording; 
private CameraRotationHelper _rotationHelper; 
private readonly DisplayRequest _displayRequest = new DisplayRequest(); 
private bool _isPreviewing; 

public MainPage() 
{ 
    this.InitializeComponent(); 
} 
private async void btnstop_Click(object sender, RoutedEventArgs e) 
{ 
    if (_mediaCapture != null) 
    { 
     if (_isPreviewing) 
     { 
      await _mediaCapture.StopPreviewAsync(); 
      _isPreviewing = false; 
      await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       PreviewControl.Source = null; 
       if (_displayRequest != null) 
       { 
        _displayRequest.RequestRelease(); 
       } 
      _mediaCapture.Dispose(); 
      }); 
     } 
    } 
} 
private async void btnpreview_Click(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     _mediaCapture = new MediaCapture(); 
     var allVideoDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture); 
     var desiredDevice = allVideoDevices.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back); 
     _cameraDevice = desiredDevice ?? allVideoDevices.FirstOrDefault(); 
     _rotationHelper = new CameraRotationHelper(_cameraDevice.EnclosureLocation); 
     _mediaCapture.Failed += MediaCapture_Failed; 
     var settings = new MediaCaptureInitializationSettings { VideoDeviceId = _cameraDevice.Id }; 
     await _mediaCapture.InitializeAsync(settings); 
     PreviewControl.Source = _mediaCapture; 
     _displayRequest.RequestActive(); 
     await _mediaCapture.StartPreviewAsync(); 
     _isPreviewing = true; 
    } 
    catch (UnauthorizedAccessException) 
    { 
     // This will be thrown if the user denied access to the camera in privacy settings 
     System.Diagnostics.Debug.WriteLine("The app was denied access to the camera"); 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine("MediaCapture initialization failed. {0}", ex.Message); 
    } 
} 

Si vous avez encore des questions, s'il vous plaît fournir un projet minimal et reproduit l'information sur l'environnement de test. Plus de détails s'il vous plaît référence le official sample.

+0

J'ai oublié de mentionner que j'ouvre l'écran de la caméra dans une page différente qui est dans un élément popup. Et j'envoie des messages en utilisant la lumière MVVM pour démarrer/arrêter, afficher/masquer l'écran de la caméra. – mbob

+0

@mbob quel élément popup? Vouliez-vous dire [this] (https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.primitives.popup) élément? Comment envoyez-vous des "messages" en utilisant la lumière MVVM? Sans reproduire votre problème, nous ne pourrions pas vous aider. –

+0

oui, ce genre de popup – mbob