2016-09-12 10 views
1

私のメディアプレーヤーの使用は非常に典型的で、再生パラメータを設定しようとすると問題が発生します。setPlaybackParams原因IllegalStateException

  1. )(メディアプレーヤー MediaPlayerのmMediaPlayer =新しいのMediaPlayerを作成します。
  2. setDataSourceは、動作することが分かっているローカルの仲介ファイルに設定します。
  3. mMediaPlayer.prepareAsync();
  4. OnPrepared()コールバックは(mMediaPlayer.startを呼び出す)

私が呼び出す場合:

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { 
    mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(2.0f)); 
} 

私は再生速度が期待通りに影響を受けたとは例外が発生していないmMediaPlayer.start()を呼び出す前。 mMediaPlayer.start()呼び出しの後にsetSpeed()呼び出しを配置すると、アプリケーションがillegateStateExceptionでクラッシュします。

興味深いのは、これは電話機(nexus 5、priv)でのみ発生しますが、テストされたタブレット(nexus 7と9)では正常に動作するということです。

私はオーディオを一時停止して数百ミリ秒待っていると言いましたが、それは役に立たなかったでしょう。

ドキュメントの設定に基づいて、オーディオ再生中の再生速度は完全に許容されます。誰がここで何が起こっているのか考えていますか?私はこれを調査するにはあまりにも多くの時間を費やしました。

ありがとうございます!

+1

誰かが 'setSpeed()'に問題があり、MediaPlayerを作成するときに 'getApplicationContext()'を使って解決できるようでした - このスレッドを見てください(https://code.google.com/ .com/p/android/issues/detail?id = 191368)。 ** ** 'new MediaPlayer()'が(少なくともいくつかのデバイスで)コンテキストとしてのみアクティビティを使用する場合、これがあなたの解決策かもしれません。あまりにも多くの "if"のための答えとして投稿していませんが、私はそれがあなたのケースで働いたかどうか聞いてみたい:) – 0X0nosugar

+1

残念なことに、メディアプレーヤーを作成するときgetApplicationContextを使用して私のために働いていない、 AOSP問題追跡システムに送信します。 – Whome

答えて

2

スライダーウィジェットで速度が変更されたときにメディアプレーヤーがリセットされ(mMediaPlayer.reset()を介して)、再設定され、一時停止または停止が不十分であることを確認しました。

スライダコールバックでは、ユーザが指定した速度を保存し、メディアプレーヤーをリセットして再生して、メディアプレーヤーがリセット前に中断した場所から再開します。 )((以前の再生パラメータを変更したところ、これはだったとクラッシュが由来)

public void onStopTrackingTouch(DiscreteSeekBar discreteSeekBar) { 
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { 
     mSpeed = speed; 
     mMediaPlayer.reset(); 
     play(mCurrentMediaId); 
    } 
} 

遊び()メディアプレーヤーを再構成し、最終的にmMediaPlayer.asyncPrepareを呼び出します。 onPrepared()コールバック内

:実行するonPrepared()コールバックにつながる、それは基本的に私は、再生パラメータ設定するには、この呼び出しの前にmMediaPlayer.start()を呼び出し、

if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) { 
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { 
     mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(mSpeed)); 
    } 
    mMediaPlayer.start(); 
    mState = PlaybackState.STATE_PLAYING; 
        ... 

TLを。ドクター;一部のデバイスで再生パラメータを変更する前にMediaPlayer.reset()を呼び出します。

関連する問題