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
Posting Komentar