Android Interview Questions - SPLessons

Android MediaPlayer

Home > Lesson > Chapter 5
SPLessons 5 Steps, 3 Clicks
5 Steps - 3 Clicks

Android MediaPlayer

Android MediaPlayer

Android provides you different ways to control playback of audio/video files and streams. One of the ways to control the audio/video files is through MediaPlayer class. MediaPlayer class can be used to access built-in mediaplayer services like playing audio,video, e.t.c. In order to use MediaPlayer, we have to call a static Method create(), which returns an instance of MediaPlayer class. The following is the syntax for calling a static method: Ex:
MediaPlayer player=MediaPlayer.create(this, R.raw.song);
After calling the create method, it is first required to call the prepare() method followed by the start() method. Ex:
player.prepare();
player.start();
Apart from the above methods, there are other methods in this class such as: The following example illustrates how to use the MediaPlayer in your application to play audio files, how to use seek bar to track the progress of the current record, and how to set the audio volume. Handler has been used to process Runnable objects associated with a thread's MessageQueue (audio tacking time). Create MainActivity.java which implements OnCompletionListener in your project. You should override onCompletion() method and also create res/raw folder to save any song.mp3. Create MainActivity.java under src/package name. MainActivity.java: [java] public class MainActivity extends Activity implements OnCompletionListener { //variable declaration Button play; TextView time; private int stateMediaPlayer; private final int stateMP_Error = 0; private final int stateMP_NotStarter = 1; private final int stateMP_Playing = 2; private final int stateMP_Pausing = 3; SeekBar track,volume; MediaPlayer player; private double timeElapsed = 0; Handler handler=new Handler(); String audio,title,desc; AudioManager audioManager; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //set activity content to external layout setContentView(R.layout.activity_main); //find views by Id play=(Button)findViewById(R.id.buttonPlay); time=(TextView)findViewById(R.id.textViewTime); track=(SeekBar)findViewById(R.id.seekBarTrack); volume=(SeekBar)findViewById(R.id.seekBarVoloume); audio=getIntent().getStringExtra("audio"); title=getIntent().getStringExtra("name"); desc=getIntent().getStringExtra("desc"); //initiate media player initMediaplayer(); //on touch track(seek bar) track.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent arg1) { // TODO Auto-generated method stub seekChange(v); return false; } }); //on click play play.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub switch(stateMediaPlayer){ case stateMP_Error: break; case stateMP_NotStarter: //playing audio for the first time player.start(); timeElapsed = player.getCurrentPosition(); track.setProgress((int) timeElapsed); handler.postDelayed(run, 100); play.setBackgroundResource(R.drawable.pause); stateMediaPlayer = stateMP_Playing; break; case stateMP_Playing: //pause player.pause(); play.setBackgroundResource(R.drawable.play); stateMediaPlayer = stateMP_Pausing; break; case stateMP_Pausing: //playing player.start(); timeElapsed = player.getCurrentPosition(); track.setProgress((int) timeElapsed); handler.postDelayed(run, 100); play.setBackgroundResource(R.drawable.pause); stateMediaPlayer = stateMP_Playing; break; } } }); //set volume if(volume!=null){ audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); volume.setMax(audioManager .getStreamMaxVolume(AudioManager.STREAM_MUSIC)); volume.setProgress(audioManager .getStreamVolume(AudioManager.STREAM_MUSIC)/2); volume.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0); } }); } } private void initMediaplayer() { try { /*playing audio from server player=new MediaPlayer(); player.setDataSource(url);*/ //palaying static audio which is under res/raw player=MediaPlayer.create(this, R.raw.song); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setOnCompletionListener(this); player.prepare(); time.setText("00:00:00"+" / "+ String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours((long)player.getDuration()), TimeUnit.MILLISECONDS.toMinutes((long)player.getDuration()) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours((long)player.getDuration())), TimeUnit.MILLISECONDS.toSeconds((long)player.getDuration()) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)player.getDuration())))); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } track.setMax(player.getDuration()); //player.getDuration(); stateMediaPlayer = stateMP_NotStarter; } Runnable run=new Runnable() { @Override public void run() { // TODO Auto-generated method stub track.setProgress(player.getCurrentPosition()); timeElapsed = player.getCurrentPosition(); double millis = timeElapsed; String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours((long)millis), TimeUnit.MILLISECONDS.toMinutes((long)millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours((long)millis)), TimeUnit.MILLISECONDS.toSeconds((long)millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)millis))); time.setText(""+hms+" / "+ String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours((long)player.getDuration()), TimeUnit.MILLISECONDS.toMinutes((long)player.getDuration()) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours((long)player.getDuration())), TimeUnit.MILLISECONDS.toSeconds((long)player.getDuration()) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long)player.getDuration())))); handler.postDelayed(run,100); } }; // This is event handler thumb moving event private void seekChange(View v){ if(player.isPlaying()){ SeekBar sb = (SeekBar)v; player.seekTo(sb.getProgress()); } } @Override public void onCompletion(MediaPlayer mp) { play.setBackgroundResource(R.drawable.play); player.seekTo(0); initMediaplayer(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { player.stop(); return super.onKeyDown(keyCode, event); } } [/java] Create activity_main.xml in res/layout folder. activity_main.xml: [xml] <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_gravity="center" android:gravity="center" android:background="#FFFFFF" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_gravity="center" android:gravity="center" android:layout_marginBottom="65dp" android:background="#FFFFFF" > <TextView android:id="@+id/textViewName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#009ACD" android:layout_marginTop="10dp" android:textSize="20sp" android:layout_gravity="center" android:text="MediaPlayer Example" /> <Button android:id="@+id/buttonPlay" android:layout_width="25dp" android:layout_height="25dp" android:background="@drawable/play" android:layout_gravity="center" android:layout_marginTop="10dp"/> <SeekBar android:id="@+id/seekBarTrack" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:layout_marginTop="10dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#555555" android:textSize="15sp" android:layout_marginLeft="30dp" android:text="TrackTime" /> <TextView android:id="@+id/textViewTime" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="30dp" android:gravity="right" android:textSize="15sp" android:textColor="#555555" android:text="00:00:00" /> </LinearLayout> <SeekBar android:id="@+id/seekBarVoloume" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:layout_marginTop="10dp" /> <TextView android:id="@+id/textViewVolume" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15sp" android:textColor="#555555" android:text="Volume" /> </LinearLayout> </RelativeLayout> [/xml] AndroidManifest.xml: [xml] <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.spl.myproject" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="16" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.spl.myproject.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> [/xml] Output: