1

私のアプリでは、いつプレイ状態が変化したかを知りたいです。しかし、イベントをサブスクライブして現在の状態を取得する方法がわかりません。どうやってやるの?ありがとう。

MSDNにステートメントがありますが、その意味と実装方法を理解できませんでした:

Windows Phone 8 では、PlayStateChangedEventArgs をチェックして、オーディオ プレーヤーが現在の再生状態に入る前に発生した CurrentPlayState と IntermediatePlayState の両方を確認できます。

詳細:

メインページでこれを行います:

public MainPage()
{
    BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged);
}

それから

private void Instance_PlayStateChanged(object sender, EventArgs e)
{
    var playerState = BackgroundAudioPlayer.Instance.PlayerState;
}

しかし、これは event と eventargs を使用する正しい方法ではないと感じています。また、正しい最新の値も得られません。

4

2 に答える 2

1

PlayerStateChangedイベントは間違いなく変更を判断する正しい方法ですが、サブスクライブしてもイベントは発生しないため、現在の状態を取得できません。代わりに次のようにしてみてください。

BackgroundAudioPlayer audioPlayer = BackgroundAudioPlayer.Instance;

public MainPage()
{
    audioPlayer += OnPlayStateChanged;
    OnPlayStateChanged(audioPlayer.PlayerState);
}

private OnPlayStateChanged(object sender, EventArgs e)
{
    OnPlayStateChanged(audioPlayer.PlayerState);
}

private OnPlayStateChanged(PlayState state)
{
    // Process state here
}

そうは言っても、指摘する価値のある2つの主要なことがあります。

まず、BackgroundAudioPlayer は非常に不安定な API です。正しい内部状態でない場合、通常は例外がスローされます。私がポッドキャスター用に開発した拡張メソッドを自由に使用してください: https://gist.github.com/richardszalay/8552812

第二PlayerStateChangedに、再生位置が変更されたときに起動されません。そのためには、を使用し、DispatcherTimer私の方法でディスプレイを更新することをお勧めします (ただし、 null 以外を返すTryGetPosition場合のみ)。GetTrackOrDefault()また、「刻み」を正しく保つために、1 秒未満のタイマー (200 ~ 300 ミリ秒) を使用することをお勧めします。PlayerState がFastForwardingまたはRewindingに変化したら、タイマーを 20 ~ 30ms に更新し、 に戻ったら元に戻しますPlaying

于 2014-01-22T03:21:51.297 に答える