android - Media Player SeekBar example

activity_main.xml
 <?xml version="1.0" encoding="utf-8"?> <LinearLayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="#ecc8ef"     android:padding="16dp"     android:orientation="vertical"     >     <RelativeLayout         android:layout_width="match_parent"         android:layout_height="wrap_content"         >         <TextView             android:id="@+id/tv_pass"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             />         <TextView             android:id="@+id/tv_duration"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_centerHorizontal="true"             />         <TextView             android:id="@+id/tv_due"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_alignParentRight="true"             android:layout_alignParentEnd="true"             />         <SeekBar             android:id="@+id/seek_bar"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_below="@id/tv_pass"             />     </RelativeLayout>     <LinearLayout         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:orientation="horizontal"         >         <Button             android:id="@+id/btn_play"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:text="Start"             />         <Button             android:id="@+id/btn_stop"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:text="Stop"             />     </LinearLayout> </LinearLayout> 
MainActivity.java
 package com.cfsuman.me.androidcodesnippets;  import android.app.Activity; import android.content.Context; import android.media.MediaPlayer; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast;   public class MainActivity extends AppCompatActivity {     private Context mContext;     private Activity mActivity;      private Button mButtonPlay;     private Button mButtonStop;      private SeekBar mSeekBar;      private TextView mPass;     private TextView mDuration;     private TextView mDue;      private MediaPlayer mPlayer;     private Handler mHandler;     private Runnable mRunnable;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          // Get the application context         mContext = getApplicationContext();         mActivity = MainActivity.this;          // Get the widget reference from xml layout         mButtonPlay = findViewById(R.id.btn_play);         mButtonStop = findViewById(R.id.btn_stop);         mSeekBar = findViewById(R.id.seek_bar);         mPass = findViewById(R.id.tv_pass);         mDuration = findViewById(R.id.tv_duration);         mDue = findViewById(R.id.tv_due);          // Initialize the handler         mHandler = new Handler();          // Click listener for playing button         mButtonPlay.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 // If media player another instance already running then stop it first                 stopPlaying();                  // Initialize media player                 mPlayer = MediaPlayer.create(mContext,R.raw.my_favorite_song);                  // Start the media player                 mPlayer.start();                 Toast.makeText(mContext,"Media Player is playing.",Toast.LENGTH_SHORT).show();                  // Get the current audio stats                 getAudioStats();                 // Initialize the seek kafe                 initializeSeekBar();              }         });          // Set a click listener for top playing button         mButtonStop.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 stopPlaying();             }         });          /*             SeekBar.OnSeekBarChangeListener                 A callback that notifies clients when the progress level has been changed. This                 includes changes that were initiated by the user through a touch gesture or                 arrow key/trackball as well as changes that were initiated programmatically.         */          // Set a change listener for seek kafe         mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {             /*                 void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser)                     Notification that the progress level has changed. Clients can use the fromUser                     parameter to distinguish user-initiated changes from those that occurred programmatically.                  Parameters                     seekBar SeekBar : The SeekBar whose progress has changed                     progress int : The current progress level. This will be in the range min..max                                    where min and max were set by setMin(int) and setMax(int),                                    respectively. (The default values for min is 0 and max is 100.)                     fromUser boolean : True if the progress change was initiated by the user.             */             @Override             public void onProgressChanged(SeekBar seekBar, int i, boolean b) {                 if(mPlayer!=null && b){                     /*                         void seekTo (int msec)                             Seeks to specified time position. Same as seekTo(long, int)                             with mode = SEEK_PREVIOUS_SYNC.                          Parameters                             msec int: the offset in milliseconds from the start to seek to                          Throws                             IllegalStateException : if the internal player engine has not been initialized                     */                     mPlayer.seekTo(i*1000);                 }             }              @Override             public void onStartTrackingTouch(SeekBar seekBar) {              }              @Override             public void onStopTrackingTouch(SeekBar seekBar) {              }         });     }      protected void stopPlaying(){         // If media player is not null then try to stop it         if(mPlayer!=null){             mPlayer.stop();             mPlayer.release();             mPlayer = null;             Toast.makeText(mContext,"Stop playing.",Toast.LENGTH_SHORT).show();             if(mHandler!=null){                 mHandler.removeCallbacks(mRunnable);             }         }     }      /*         int getDuration ()             Gets the duration of the file.          Returns             int the duration in milliseconds, if no duration is available             (for example, if streaming live content), -1 is returned.     */      /*         int getCurrentPosition ()             Gets the current playback position.          Returns             int the current position in milliseconds     */      protected void getAudioStats(){         int duration  = mPlayer.getDuration()/1000; // In milliseconds         int due = (mPlayer.getDuration() - mPlayer.getCurrentPosition())/1000;         int pass = duration - due;          mPass.setText("" + pass + " seconds");         mDuration.setText("" + duration + " seconds");         mDue.setText("" + due + " seconds");     }      protected void initializeSeekBar(){         mSeekBar.setMax(mPlayer.getDuration()/1000);          mRunnable = new Runnable() {             @Override             public void run() {                 if(mPlayer!=null){                     int mCurrentPosition = mPlayer.getCurrentPosition()/1000; // In milliseconds                     mSeekBar.setProgress(mCurrentPosition);                     getAudioStats();                 }                 mHandler.postDelayed(mRunnable,1000);             }         };         mHandler.postDelayed(mRunnable,1000);     } } 

Komentar