使用 exoplayer 播放音频时搜索栏不移动

时间:2021-06-06 23:38:27

标签: android kotlin exoplayer2.x android-seekbar

我正在使用 ExoPlayer 构建音乐应用。

seekBar 出现问题,播放歌曲时它不动..

我可以搜索歌曲的特定部分,但搜索栏上不显示进度。

current seekbar behavior

songDetails.xml

<SeekBar
    android:id="@+id/seek_bar"
    android:layout_width="0dp"
    android:layout_height="18dp"
    android:layout_marginStart="10dp"
    android:layout_marginTop="40dp"
    android:layout_marginEnd="10dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.35"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/ic_like"
    app:layout_constraintVertical_bias="0.0" />

<TextView
    android:id="@+id/txt_current_time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="10dp"
    android:layout_marginTop="5dp"
    android:includeFontPadding="false"
    android:text="00:00"
    android:textColor="@color/app_name_color"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="@+id/seek_bar"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="@+id/seek_bar"
    app:layout_constraintTop_toBottomOf="@+id/seek_bar"
    app:layout_constraintVertical_bias="0.0" />

<TextView
    android:id="@+id/txt_song_duration"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:layout_marginEnd="10dp"
    android:includeFontPadding="false"
    android:text="00:00"
    android:textColor="@color/app_name_color"
    app:layout_constraintBottom_toBottomOf="@+id/txt_current_time"
    app:layout_constraintEnd_toEndOf="@+id/seek_bar"
    app:layout_constraintHorizontal_bias="0.996"
    app:layout_constraintStart_toEndOf="@+id/txt_current_time"
    app:layout_constraintTop_toTopOf="@+id/txt_current_time"
    app:layout_constraintVertical_bias="1.0" />

SongDetailsViewModel

class SongViewModel @ViewModelInject constructor(musicServiceConnection: MusicServiceConnection) : ViewModel() {

private val playBackState = musicServiceConnection.playbackState
private val _currentSongDuration = MutableLiveData<Long>()
val currentSongDuration: LiveData<Long> = _currentSongDuration
private val _currentPlayerPosition = MutableLiveData<Long>()
val currentPlayerPosition: LiveData<Long> = 
_currentPlayerPosition


init {
    updateCurrentPlayerPosition()
}

private fun updateCurrentPlayerPosition() {
    viewModelScope.launch {
        while (true){
            val position = playBackState.value?.currentPlaybackPosition

            if (currentPlayerPosition.value != position){
                _currentPlayerPosition.postValue(position!!)
               _currentSongDuration.postValue(MusicService.curSongDuration)
            }
           delay(UPDATE_PLAYER_POSITION_INTERVAL)
       }
    }
  }
}

歌曲片段

@AndroidEntryPoint
    class SongDetailsFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    subscribeToObservers() 
     binding.seekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
    override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                if (fromUser) {
                    updatePlayingTime(progress.toLong())
                }
            }

      override fun onStartTrackingTouch(seekBar: SeekBar?) {
                shouldUpdateSeekBar = false
            }

       override fun onStopTrackingTouch(seekBar: SeekBar?) {
                binding.seekBar.let {
                    mainViewModel.seekTo(it.progress.toLong())
                    shouldUpdateSeekBar = true
                }
            }
        })   
     }
     
    private fun subscribeToObservers() {
    mainViewModel.currentlyPlayingSong.observe(viewLifecycleOwner) {
    if (it == null) return@observe
    currentPlayingSong = it.toSong()
    val formattedDuration = it.toSong()?.duration?.let { Utility.getSongDuration(true, it) }
    binding.txtSongDuration.text = formattedDuration
      }
    }

     mainViewModel.playBackState.observe(viewLifecycleOwner) {
     playbackState = it
     binding.seekBar.progress = it?.position?.toInt() ?: 0}

    songViewModel.currentPlayerPosition.observe(viewLifecycleOwner){
    binding.seekBar.progress = it.toInt()
    if (shouldUpdateSeekBar){
    binding.seekBar.progress = it.toInt()
    updatePlayingTime(it)
      }
    }    

    songViewModel.currentSongDuration.observe(viewLifecycleOwner) {
            binding.seekBar.max = it.toInt()
     }
    }
   
     private fun updatePlayingTime(ms: Long){
     val dateFormat = SimpleDateFormat("mm:ss", Locale.getDefault())
     binding.txtCurrentTime.text = dateFormat.format(ms)
    }

我已经被困在这个问题上好几天了.. 不知道问题出在哪里。除非您寻找,否则片段中未观察/更新当前歌曲位置。

seekbar 不动了!帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用 exoplayer 的默认时间栏来防止额外编码

      <com.google.android.exoplayer2.ui.DefaultTimeBar
            android:id="@id/exo_progress"
            android:layout_width="@dimen/infobar_width_1920dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tv_content_name"
            app:played_color="@color/themeRed"
            app:buffered_color="@color/colorWhiteTrans_25"
            app:scrubber_color="@color/white"
            app:unplayed_color="@color/black"
            app:scrubber_enabled_size="@dimen/item_margin_20dp"
            app:scrubber_dragged_size="@dimen/item_margin_30dp" />