2016-11-12 13 views
1

私は、インターネットサーバー上でホストされているmp4ファイルを再生するためにmediaPlayerElementを使用するWindows 10ユニバーサルアプリケーションを作成しています。DisplayRequestがWindowsユニバーサルアプリケーションで動作していません

動画はうまく再生されますが、画面がロックされるとアプリが一時停止します。私は、DisplayRequestを使って画面を消さなければならないことを知りました。私はhttps://msdn.microsoft.com/en-us/library/windows/apps/Windows.UI.Xaml.Controls.MediaPlayerElement.aspx 上で参照コードが含まれていますが、まだ動作しないと私はコンピュータ上でアプリケーションをデバッグするとき、アプリケーションはDisplayRequestを呼び出した後にクラッシュし、例外は次のとおりです。

シングルスレッドクラスをアクティブにMTAからではありません

例をそのままコピー&ペーストして、x64とARMの両方で周年更新をターゲットにしました。

//Video url is on the button tag, I have commented out the code as it doesn't work 
private void Button_Tapped(object sender, TappedRoutedEventArgs e) 
    { 
     var source = sender; 
     if (source.GetType() == typeof(Button)) 
     { 
      var button = source as Button; 

      Player.Source = MediaSource.CreateFromUri(new Uri(button.Tag.ToString())); 
      //if ((Player.MediaPlayer != null) && (!isPlayerSet)) 
      //{ 
      // Player.MediaPlayer.PlaybackSession.PlaybackStateChanged += MediaPlayerElement_CurrentStateChanged; 
      // isPlayerSet = true; 
      //} 

     } 
    } 

//I have copied the below from the referenced url 
private void MediaPlayerElement_CurrentStateChanged(MediaPlaybackSession sender, object args) 
    { 
     MediaPlaybackSession playbackSession = sender as MediaPlaybackSession; 
     if (playbackSession != null && playbackSession.NaturalVideoHeight != 0) 
     { 
      if (playbackSession.PlaybackState == MediaPlaybackState.Playing) 
      { 
       if (appDisplayRequest == null) 
       { 
        // This call creates an instance of the DisplayRequest object 
//This line throws the exception when debugging      
appDisplayRequest = new DisplayRequest(); 
        appDisplayRequest.RequestActive(); 
       } 
      } 
      else // PlaybackState is Buffering, None, Opening, or Paused. 
      { 
       if (appDisplayRequest != null) 
       { 
        // Deactivate the display request and set the var to null. 
        appDisplayRequest.RequestRelease(); 
        appDisplayRequest = null; 
       } 
      } 
     } 
    } 
+0

あなたはUIスレッドではないスレッドプールのスレッドでDisplayRequestを起動していることを確認します、問題を解決し、イベントを処理するための別の方法を追加し、UIスレッドでコードを実行するために、ディスパッチャを使用するには

。 –

+0

こんにちは、返事をいただきありがとうございます、あなたは何を意味するのか説明していただけますか?私は、mediaplayerelementを含むビューのコードの上でそれを呼び出すのですが、私はそれがUIだと言います。乾杯 – hlovbeyond

+0

どのイベントハンドラでメソッドを呼び出しますか?質問に例外をスローする呼び出しコードを含めてください。 –

答えて

1

あなたはUIスレッド上でRequestActivateメソッドを呼び出す必要があります:

すべてのヘルプは

乾杯、以下 H

コード、それを大幅に感謝します。

MTAからシングルスレッドクラスをアクティブ化することはサポートされていません。

あなたは非UIスレッドを解雇されMediaPlayer.CurrentStateChangedイベントにMediaPlayerElement_CurrentStateChanged方法を添付している、それは例外で終わる非UIスレッドでRequestActivateを呼び出すにつながります。

private CoreDispatcher dispatcher; 
public MainPage() { 
    this.InitializeComponent(); 
    dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher; 
} 
private void Button_Tapped(object sender, TappedRoutedEventArgs e) { 
    .. 
    .. 
    Player.MediaPlayer.PlaybackSession.PlaybackStateChanged += PlaybackSession_PlaybackStateChanged; 
    .. 
} 
private PlaybackSession_PlaybackStateChanged(object sender, MediaPlaybackSession sender, object args) { 
    dispatcher.RunAsync(DispatcherPriority.Normal,() => { 
     // 
     // Code to keep display on 
     // 
    }); 
} 
+0

あなたは卿です、伝説です。それは魅力のように働く。ありがとう!!! – hlovbeyond

関連する問題