Advertisement
Guest User

Android Media Player Problem

a guest
Oct 31st, 2018
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 7.24 KB | None | 0 0
  1. //package
  2.  
  3.  
  4. import android.media.MediaPlayer
  5. import android.os.Bundle
  6. import android.os.Handler
  7. import android.support.v4.app.Fragment
  8. import android.util.Log
  9. import android.view.LayoutInflater
  10. import android.view.View
  11. import android.view.ViewGroup
  12. import android.widget.Button
  13. import android.widget.ImageView
  14. import android.widget.SeekBar
  15. import android.widget.TextView
  16. import com.example.vitali.musicplayer.R
  17. import java.text.SimpleDateFormat
  18. import java.util.*
  19. import kotlin.properties.Delegates
  20.  
  21.  
  22.  
  23. class MusicPlayerFragment: Fragment(),
  24.     View.OnClickListener,
  25.     MediaPlayer.OnPreparedListener,
  26.     SeekBar.OnSeekBarChangeListener {
  27.  
  28.     companion object {
  29.  
  30.         const val TAG = "MusicPlayerFragment"
  31.  
  32.         const val STATE_CURRENT_PLAYING_POSITION = "playerPosition"
  33.         const val STATE_IS_PLAYING = "isPlaying"
  34.  
  35.         const val UPDATE_TIME = 1000.toLong()
  36.         val TIME_FORMATTER = SimpleDateFormat("mm:ss")
  37.     }
  38.  
  39.     private enum class PlayerSate {
  40.         PLAYING,
  41.         STOPPED
  42.     }
  43.  
  44.  
  45.  
  46.     //region Views
  47.     lateinit var mainView: View
  48.  
  49.     lateinit var songName: TextView
  50.     lateinit var songCover: ImageView
  51.     lateinit var songCurrentTime: TextView
  52.     lateinit var songEndTime: TextView
  53.     lateinit var songProgressHandler: SeekBar
  54.     lateinit var songPlayPauseButton: Button
  55.     lateinit var songPreviousButton: Button
  56.     lateinit var songNextButton: Button
  57.     //endregion
  58.  
  59.     //region Properties
  60.  
  61.     private var mediaPlayer: MediaPlayer? = null
  62.     private var mediaPlayerState: PlayerSate by Delegates.observable(PlayerSate.STOPPED) { _, _, _ ->
  63.         updateState()
  64.     }
  65.  
  66.     private val handler = Handler()
  67.     private val updateProgressTask: Runnable = object : Runnable {
  68.         override fun run() {
  69.             try {
  70.                 updateProgress()
  71.             } finally {
  72.                 handler.postDelayed(this, UPDATE_TIME)
  73.             }
  74.         }
  75.     }
  76.  
  77.     //endregion
  78.  
  79.  
  80.     //region Lifecycle methods
  81.  
  82.     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
  83.         Log.d(TAG, "onCreateView")
  84.         mainView = inflater.inflate(R.layout.fragment_music_player, container, false)
  85.         return mainView
  86.     }
  87.  
  88.     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  89.         Log.d(TAG, "onViewCreated")
  90.         super.onViewCreated(view, savedInstanceState)
  91.         findViews(mainView)
  92.         setupPlayPause()
  93.         setupSeekBar()
  94.  
  95.     }
  96.  
  97.     override fun onActivityCreated(savedInstanceState: Bundle?) {
  98.         Log.d(TAG, "onActivityCreated")
  99.         super.onActivityCreated(savedInstanceState)
  100.  
  101.         mediaPlayer = MediaPlayer.create(activity, R.raw.lobo_loco_03_streetlife_silentfilm)
  102.         mediaPlayer!!.setOnPreparedListener(this)
  103.         if (savedInstanceState != null){
  104.             restoreState(savedInstanceState)
  105.         }
  106.     }
  107.  
  108.     override fun onStop() {
  109.         Log.d(TAG, "onStop")
  110.         super.onStop()
  111.         handler.removeCallbacks(updateProgressTask)
  112.         mediaPlayer?.release()
  113.         mediaPlayer = null
  114.     }
  115.  
  116.  
  117.     override fun onSaveInstanceState(outState: Bundle) {
  118.         Log.d(TAG, "onSaveInstanceState")
  119.         super.onSaveInstanceState(outState)
  120.         val position = mediaPlayer!!.currentPosition
  121.         outState.putInt(STATE_CURRENT_PLAYING_POSITION, position)
  122.         outState.putBoolean(STATE_IS_PLAYING, mediaPlayer!!.isPlaying)
  123.     }
  124.  
  125.  
  126.     //endregion
  127.  
  128.  
  129.     //region Initialization and setup methods
  130.  
  131.     private fun findViews(mainView: View){
  132.         songName = mainView.findViewById(R.id.songNameTextView)
  133.         songCover = mainView.findViewById(R.id.songCoverImageView)
  134.         songCurrentTime = mainView.findViewById(R.id.songCurrentTimeTextView)
  135.         songEndTime = mainView.findViewById(R.id.songDurationTextView)
  136.         songProgressHandler = mainView.findViewById(R.id.songPositionSeekBar)
  137.         songPlayPauseButton = mainView.findViewById(R.id.songPlayPauseButton)
  138.         songPreviousButton = mainView.findViewById(R.id.songPrevButton)
  139.         songNextButton = mainView.findViewById(R.id.songNextButton)
  140.     }
  141.  
  142.     private fun setupPlayPause() {
  143.         songPlayPauseButton.setOnClickListener(this)
  144.     }
  145.  
  146.     private fun setupSeekBar(){
  147.         songProgressHandler.setOnSeekBarChangeListener(this)
  148.     }
  149.  
  150.     private fun setupSongInfoViews(){
  151.         val songDuration = mediaPlayer!!.duration
  152.         updateTimeLabel(songEndTime, songDuration)
  153.         songProgressHandler.max = songDuration
  154.  
  155.     }
  156.  
  157.  
  158.     private fun restoreState(bundle: Bundle){
  159.  
  160.         val position = bundle.getInt(STATE_CURRENT_PLAYING_POSITION)
  161.         val isPlaying = bundle.getBoolean(STATE_IS_PLAYING)
  162.         mediaPlayer!!.seekTo(position)
  163.         updateProgress()
  164.         mediaPlayerState = if (isPlaying){
  165.             PlayerSate.PLAYING
  166.         } else {
  167.             PlayerSate.STOPPED
  168.         }
  169.     }
  170.  
  171.     //endregion
  172.  
  173.  
  174.     //region OnClickListener
  175.  
  176.     override fun onClick(v: View?) {
  177.         if (v != null) {
  178.             when (v.id) {
  179.                 R.id.songPlayPauseButton -> playPauseClicked()
  180.                 R.id.songNextButton -> nextClicked()
  181.                 R.id.songPrevButton -> prevClicked()
  182.             }
  183.         }
  184.     }
  185.     //endregion
  186.  
  187.  
  188.     //region Click Methods
  189.  
  190.     private fun playPauseClicked(){
  191.         mediaPlayerState = when (mediaPlayerState) {
  192.             PlayerSate.PLAYING -> PlayerSate.STOPPED
  193.             PlayerSate.STOPPED -> PlayerSate.PLAYING
  194.         }
  195.     }
  196.  
  197.     private fun prevClicked(){
  198.         throw NotImplementedError()
  199.     }
  200.  
  201.     private fun nextClicked(){
  202.         throw NotImplementedError()
  203.     }
  204.     //endregion
  205.  
  206.     private fun updateState(){
  207.         when (mediaPlayerState){
  208.             PlayerSate.PLAYING -> {
  209.                 mediaPlayer?.start()
  210.                 songPlayPauseButton.text = getString(R.string.music_player_pause_title)
  211.             }
  212.             PlayerSate.STOPPED -> {
  213.                 mediaPlayer?.pause()
  214.                 songPlayPauseButton.text = getString(R.string.music_player_play_title)
  215.             }
  216.         }
  217.     }
  218.  
  219.     private fun updateProgress(){
  220.         val currentProgress = mediaPlayer!!.currentPosition
  221.         updateTimeLabel(songCurrentTime, currentProgress)
  222.         songProgressHandler.progress = mediaPlayer!!.currentPosition
  223.  
  224.     }
  225.  
  226.     private fun updateTimeLabel(timeLabel: TextView, progress: Int) {
  227.         timeLabel.text = TIME_FORMATTER.format(Date(progress.toLong()))
  228.     }
  229.  
  230.  
  231.     //region MediaPlayer.OnPreparedListener
  232.     override fun onPrepared(mp: MediaPlayer?) {
  233.         Log.d(TAG, "onPreparedMediaPlayer, duration " + mediaPlayer!!.duration)
  234.         setupSongInfoViews()
  235.         updateProgressTask.run()
  236.     }
  237.     //endregion
  238.  
  239.     //region SeekBar.OnSeekBarChangeListener
  240.  
  241.     override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
  242.         updateTimeLabel(songCurrentTime, progress)
  243.     }
  244.  
  245.     override fun onStartTrackingTouch(seekBar: SeekBar?) {
  246.  
  247.     }
  248.  
  249.     override fun onStopTrackingTouch(seekBar: SeekBar?) {
  250.         updateTimeLabel(songCurrentTime, seekBar!!.progress)
  251.         mediaPlayer!!.seekTo(seekBar!!.progress)
  252.     }
  253.     //endregion
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement