2016-09-27 4 views
2

をonPlaybackStateChangedトリガされません、私は歌を開始し、それは2つの状態を経て取得する、最後の1はPlaybackStateCompat.STATE_PLAYINGSeekTo私は、このメディアプレーヤーおよび他のすべてが正常に動作していMediaControllerCompat

ているので、我々はコールバックが登録されていると言うことができます。問題は、SeekBarリスナーをトリガーするたびに、seekToメソッドがonPlaybackStateChangedをトリガーしないため、これは発生しないため、SeekBarを新しい進捗状況に更新できません。これはUIにのみ関係します。 SeekBarの進行状況を変更した後、実際に進行中の音楽が再生されています。さらに、trackDurationTextViewも更新されません。私は親指をシークバーにドラッグしている間に値を変更しますが、一度リリースすれば、それはシークバーと同じように最初の進捗になります。

ここにコールバックが登録されています。

@Override 
    public void onServiceConnected(ComponentName componentName, IBinder service) { 
     if (service instanceof MediaPlayerService.ServiceBinder) { 
      try { 
       mediaController = new MediaControllerCompat(this, ((MediaPlayerService.ServiceBinder) service).getService().getMediaSessionToken()); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
      mediaController.registerCallback(mMediaControllerCallback); 
     } 
    } 

これは、コールバックが初期化されている方法です。

private MediaControllerCompat.Callback mMediaControllerCallback = new MediaControllerCompat.Callback() { 
     @Override 
     public void onPlaybackStateChanged(@NonNull PlaybackStateCompat state) { 
      updatePlaybackState(state); 
     } 

     @Override 
     public void onMetadataChanged(MediaMetadataCompat metadata) { 
      if (metadata != null) { 
       updateMediaDescription(metadata.getDescription()); 
       updateDuration(metadata); 
      } 
     } 
    }; 

これはこれはmLastPlayBackState.getPositionは、シークバーの後に新しい値を返すべき場所であるOnSeekBarChangeListener

trackSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
       trackDurationTextView.setText(DateUtils.formatElapsedTime(progress/1000)); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
       stopSeekbarUpdate(); 
      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
       //TODO: look here! the seek bar position is not kept when the user slides it! 
       mediaController.getTransportControls().seekTo(seekBar.getProgress()); 
       scheduleSeekBarUpdate(); 
      } 
     }); 


private void updateProgress() { 
     if (mLastPlaybackState == null) { 
      return; 
     } 
     long currentPosition = mLastPlaybackState.getPosition(); 
     if (mLastPlaybackState.getState() != PlaybackStateCompat.STATE_PAUSED) { 
      // Calculate the elapsed time between the last position update and now and unless 
      // paused, we can assume (delta * speed) + current position is approximately the 
      // latest position. This ensure that we do not repeatedly call the getPlaybackState() 
      // on MediaControllerCompat. 
      long timeDelta = SystemClock.elapsedRealtime() - 
        mLastPlaybackState.getLastPositionUpdateTime(); 

      currentPosition += (int) timeDelta * mLastPlaybackState.getPlaybackSpeed(); 
     } 
     trackSeekBar.setProgress((int) currentPosition); 
    } 

ですonPlaybackStateChangedが呼び出されないため常に0が返されます。なぜどんなアイデア?

+0

解決方法が見つかりましたか? seekToが再生を開始するが、状態が更新されない同様の問題に直面しています。 – mobiledev

+0

'Callback.onSeekTo'のコードは何ですか?あなたは 'mediaSession.setState()'をどこで呼びますか? – ianhanniballake

答えて

0

MediaControllerCompat.Callback.onPlaybackStateChanged(PlaybackStateCompat state)は、MediaSessionCompatPlaybackStateCompatstateが変更された場合にのみ呼び出されます。 stateが変更されずにPlaybackStateCompatpositionが変更された場合は、onPlaybackStateChanged(...)が呼び出されません。だから私は "onPlaybackStateChanged"と仮定し、APIは具体的にはPlaybackStateCompatのを指し、PlaybackStateCompatは指しません。この問題を回避するには

、私は一時的に地位と経過時間TextViewのテキスト「私はSeekBarを更新できるようにUI上onPlaybackStateChanged(...)をトリガするためにシークコマンドの後PlaybackStateCompat.STATE_REWINDINGまたはPlaybackStateCompat.STATE_FAST_FORWARDINGへのstatePlaybackStateCompatを更新新しい再生位置。

更新日:私はもうこの問題を再現できません。私はそれを修正するために何が変わったのかよく分かりません。あなたの最初の提案はmediaSessionオブジェクトにを呼び出していることを確認することです。ここでstatepositionの値を含むPlaybackStateCompatです。これは私にとっての解決策ではありませんでしたが、私が最初に見ていたところです。

+0

私はまだこの問題に直面しています。確実な答えはありますか? –

+0

あなたは私を助けることができますか?私のMediaControllerCompat.getMediaController(getActivity())。getPlaybackState()。getState()は常にSTATE_NONEを返します。 –

関連する問題