---
title: "Custom Media player in Android"  
description: "Hi everyone in this article I’m explaining about Using Custom Media player in Android"  
author: "Manoj Pandey"  
published: 2015-03-17  
updated: 2019-10-26  
canonical: https://www.mindstick.com/articles/1667/custom-media-player-in-android  
category: "android"  
tags: ["android", "android controls"]  
reading_time: 7 minutes  

---

# Custom Media player in Android

The Android multimedia [framework](https://yourviews.mindstick.com/view/81101/time-for-improvement-in-healthcare-facility-framework) includes support for playing variety of common media types, so that you can easily integrate audio, video and images into your [applications](https://www.mindstick.com/articles/12847/how-to-choose-the-right-ethernet-cable-for-industrial-applications) using MediaPlayer APIs. Android MediaPlayer class can be used to control playback of audio/[video files](https://answers.mindstick.com/qa/94829/my-android-doesn-t-open-video-files-what-should-i-do) and streams.\

MediaPlayer class can be used to control playback of audio/video files and streams.

Here I am creating example of media player which read data from your sdcard.

1. Create an android project

2. Add [permission](https://answers.mindstick.com/qa/33390/how-to-enable-api-access-in-salesforce-by-permission-set) for read [external storage](https://answers.mindstick.com/qa/51623/what-external-storage-options-are-available-for-the-touch-bar-macbook-pro-are-adapters-required) data in [your application](https://answers.mindstick.com/qa/95487/how-do-you-troubleshoot-when-your-application-link-is-not-responding) on [AndroidManifest.xml file](https://www.mindstick.com/interview/2588/explain-androidmanifest-xml-file-in-detail)

```
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.example.androidmediaexample"    android:versionCode="1"    android:versionName="1.0" >     <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>     <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity         android:name="com.example.androidmediaexample.MainActivity"            android:configChanges="orientation|screenSize"            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>
```

3. Add view in activity_main.xml file

```
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >     <LinearLayout        android:layout_width="fill_parent"        android:layout_height="0dp"        android:layout_weight=".50"        android:gravity="center"        android:orientation="vertical" >         <TextView            android:id="@+id/mytextview"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:singleLine="true"            android:text="My Song.mp3"            android:textSize="18sp" />         <ImageView            android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:padding="10sp"            android:src="@drawable/ic_launcher" />    </LinearLayout>     <LinearLayout        android:layout_width="fill_parent"        android:layout_height="0dp"        android:layout_weight=".50"        android:orientation="vertical" >         <LinearLayout            android:layout_width="fill_parent"            android:layout_height="0dp"            android:layout_weight=".15"            android:orientation="horizontal" >             <TextView                android:id="@+id/tvTime"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight=".15"                android:text="0.0" />             <SeekBar                android:id="@+id/seekBar1"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight=".72" />             <TextView                android:id="@+id/tvLastTime"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight=".13"                android:text="0.0" />        </LinearLayout>         <LinearLayout            android:layout_width="fill_parent"            android:layout_height="0dp"            android:layout_weight=".35"            android:orientation="horizontal" >             <ImageButton                android:id="@+id/btnPrevious"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight=".30"                android:src="@android:drawable/ic_media_rew" />             <ImageButton                android:id="@+id/btnPaly"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight=".30"                android:src="@android:drawable/ic_media_play" />             <ImageButton                android:id="@+id/btnPause"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight=".30"                android:src="@android:drawable/ic_media_pause"                android:visibility="gone" />             <ImageButton                android:id="@+id/btnNext"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight=".30"                android:src="@android:drawable/ic_media_ff" />        </LinearLayout>    </LinearLayout> </LinearLayout>
```

4. Add layout xml file for listview name as mylistview.xml

```
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >     <ListView        android:id="@+id/myList"        android:layout_width="fill_parent"        android:layout_height="wrap_content" >    </ListView> </LinearLayout>
```

5. Add layout xml file for listview item name as listview_item.xml

```
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <ImageView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10sp"        android:src="@drawable/ic_launcher" />    <TextView        android:id="@+id/tvTitle"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10sp"        android:layout_marginTop="20sp" /></LinearLayout>
```

6. Paste following code in MainActivity.class

```
package com.example.androidmediaexample; import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.concurrent.TimeUnit; import android.media.MediaPlayer;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.annotation.SuppressLint;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.ImageButton;import android.widget.ListView;import android.widget.SeekBar;import android.widget.SeekBar.OnSeekBarChangeListener;import android.widget.TextView;import android.widget.Toast; public class MainActivity extends Activity {      Timer timer;     List<String> mediaList = new ArrayList<String>();      TextView tvCtime, tvLtime, tvTitle;     ImageButton imgPlay, imgStop, imgNext, imgPrevious;     private MediaPlayer mediaPlayer;     double totaltime = 0.0;     private Handler durationHandler = new Handler();     List<String> mySong;     double curenttime = 0.0;     SeekBar seekbar;     boolean seektouch;     int SongPos = 0;     String externalStoragePath;     ArrayAdapter<String> myadapter;     File targetDir;     File[] mediaFiles;      @Override     protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           try {                 mySong = new ArrayList<String>();       externalStoragePath = Environment.getExternalStorageDirectory()                           .getAbsolutePath();                 targetDir = new File(externalStoragePath);                mediaFiles = targetDir.listFiles();                scanFiles(mediaFiles);                 setContentView(R.layout.activity_main);                tvTitle = (TextView) findViewById(R.id.mytextview);                imgPlay = (ImageButton) findViewById(R.id.btnPaly);                imgStop = (ImageButton) findViewById(R.id.btnPause);                imgNext = (ImageButton) findViewById(R.id.btnNext);                seekbar = (SeekBar) findViewById(R.id.seekBar1);           imgPrevious = (ImageButton) findViewById(R.id.btnPrevious);              String[] string = mediaList.get(0).toString().split("/");                String text = string[string.length - 1];                tvTitle.setText(text);                 mediaPlayer = MediaPlayer.create(this,                           Uri.parse(mediaList.get(SongPos)));                 tvCtime = (TextView) findViewById(R.id.tvTime);                tvLtime = (TextView) findViewById(R.id.tvLastTime);                timer = new Timer();                totaltime = mediaPlayer.getDuration();                imgPlay.setOnClickListener(new OnClickListener() {                      @Override                     public void onClick(View v) {                           // TODO Auto-generated method stub                           try {                               mediaPlayer.reset();                             SongPos++;                            setSong(SongPos);                           totaltime = mediaPlayer.getDuration();                        curenttime = mediaPlayer.getCurrentPosition();                            seekbar.setMax(mediaPlayer.getDuration());                                PlaySong();                            } catch (Exception ex) {                                  }                     }                });                imgNext.setOnClickListener(new OnClickListener() {                      @Override                     public void onClick(View v) {                           // TODO Auto-generated method stub                           // set next song                           mediaPlayer.reset();                           if (SongPos >= mediaList.size() - 1)                                SongPos = 0;                           else                                SongPos++;                           setSong(SongPos);                           totaltime = mediaPlayer.getDuration();                        curenttime = mediaPlayer.getCurrentPosition();                           seekbar.setMax(mediaPlayer.getDuration());                            PlaySong();                      }                });                imgPrevious.setOnClickListener(new OnClickListener() {                      @Override                     public void onClick(View v) {                           // TODO Auto-generated method stub                           // set previous song                           mediaPlayer.reset();                           if (SongPos == 0)                                SongPos = mediaList.size() - 1;                           else                                SongPos--;                           setSong(SongPos);                           totaltime = mediaPlayer.getDuration();                         curenttime = mediaPlayer.getCurrentPosition();                           seekbar.setMax(mediaPlayer.getDuration());                            PlaySong();                     }                 });     seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {                      @Override                     public void onStopTrackingTouch(SeekBar seekBar) {                           // TODO Auto-generated method stub                           seektouch = false;                     }                      @Override                     public void onStartTrackingTouch(SeekBar seekBar) {                           // TODO Auto-generated method stub                           seektouch = true;                     }                      @Override           public void onProgressChanged(SeekBar seekBar, int progress,                                boolean fromUser) {                           // TODO Auto-generated method stub                           // increasing song                           if (seektouch) {                                curenttime = progress;                                mediaPlayer.seekTo((int) curenttime);                           }                      }                });                imgPlay.setOnClickListener(new OnClickListener() {                      @Override                     public void onClick(View v) {                           // TODO Auto-generated method stub                           if (SongPos >= mediaList.size())                                SongPos = 0;                         curenttime = mediaPlayer.getCurrentPosition();                           imgPlay.setVisibility(View.GONE);                           imgStop.setVisibility(View.VISIBLE);                           seekbar.setMax(mediaPlayer.getDuration());                            PlaySong();                     }                });                imgStop.setOnClickListener(new OnClickListener() {                      @Override                     public void onClick(View v) {                           // TODO Auto-generated method stub                           imgPlay.setVisibility(View.VISIBLE);                           imgStop.setVisibility(View.GONE);                           StopSong();                     }                });           } catch (Exception ex) {                          }     }      @SuppressLint("NewApi")     public void PlaySong() {           // start song           mediaPlayer.start();           if (mediaPlayer.isPlaying()) {                imgPlay.setVisibility(View.GONE);                imgStop.setVisibility(View.VISIBLE);           }            curenttime = mediaPlayer.getCurrentPosition();           seekbar.setProgress((int) curenttime);           // set total time of song           tvLtime.setText(String.format(                     "%d:%d ",           TimeUnit.MILLISECONDS.toMinutes((long) totaltime),               TimeUnit.MILLISECONDS.toSeconds((long) totaltime)                    - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS                   .toMinutes((long) totaltime))));           durationHandler.postDelayed(updateSeekBarTime, 100);      }      public void StopSong() {           // pause song and get time before pause           curenttime = mediaPlayer.getCurrentPosition();           mediaPlayer.pause();     }      private Runnable updateSeekBarTime = new Runnable() {            @SuppressLint("NewApi")           public void run() {                 // get current position                 curenttime = mediaPlayer.getCurrentPosition();                 // set seekbar progress                 seekbar.setProgress((int) curenttime);                 // set current timing of song                 tvCtime.setText(String.format(                           "%d:%d ",                  TimeUnit.MILLISECONDS.toMinutes((long) curenttime),                  TimeUnit.MILLISECONDS.toSeconds((long) curenttime)                 - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS                        .toMinutes((long) curenttime))));                // repeat yourself that again in 100 miliseconds                 durationHandler.postDelayed(this, 100);            }      };      /**      * scanFiles      *       * @param scanFiles      */     // scan directories from your sdcard     public void scanFiles(File[] scanFiles) {            if (scanFiles != null) {                for (File file : scanFiles) {                      if (file.isDirectory()) {                           scanFiles(file.listFiles());                      } else {                            addToMediaList(file);                       }                 }           } else {            }     }      private void addToMediaList(File file) {            if (file != null) {                 String path = file.getAbsolutePath();                 int index = path.lastIndexOf(".");                // get extension of folder               String extn = path.substring(index + 1, path.length());                // find mp3                if (extn.equalsIgnoreCase("mp3")) {// ||                      mediaList.add(path);                 }           }      }      public void setSong(int sing) {           try {                if (SongPos >= mediaList.size()) {                     SongPos = 0;                }         mediaPlayer.setDataSource(mediaList.get(SongPos).toString());                mediaPlayer.prepare();           String[] string = mediaList.get(sing).toString().split("/");                String text = string[string.length - 1];                tvTitle.setText(text);           } catch (IllegalArgumentException e) {                e.printStackTrace();           } catch (SecurityException e) {                e.printStackTrace();           } catch (IllegalStateException ex) {                Toast.makeText(getApplicationContext(), ex.toString(),                           Toast.LENGTH_LONG).show();           } catch (IOException e) {                e.printStackTrace();           }     }      @Override     public boolean onCreateOptionsMenu(Menu menu) {           MenuInflater inflater = getMenuInflater();           inflater.inflate(R.menu.main, menu);           return true;     }      public void MenuClick() {           try {                String text;                mySong.clear();                for (int i = 0; i < mediaList.size(); i++) {             String[] string = mediaList.get(i).toString().split("/");                     text = string[string.length - 1];                     mySong.add(text);                }                // Add list in dialog box            AlertDialog.Builder alertDialog = new AlertDialog.Builder(                           MainActivity.this);                LayoutInflater inflater = getLayoutInflater();       View convertView = (View) inflater.inflate(R.layout.mylistview,                           null);                alertDialog.setView(convertView);        ListView lv = (ListView) convertView.findViewById(R.id.myList);                final AlertDialog alert = alertDialog.create();                 alert.setTitle(" Select song to play...."); // Title        myadapter = new MyAdapter(this, R.layout.listview_item, mySong);                lv.setAdapter(myadapter);                lv.setOnItemClickListener(new OnItemClickListener() {                      @Override             public void onItemClick(AdapterView<?> arg0, View arg1,                                int pos, long arg3) {                           // TODO Auto-generated method stub                            SongPos = pos;                           SongPos++;                           imgPrevious.performClick();                            alert.cancel();                           // PlaySong();                     }                });                alert.show();           } catch (Exception ex) {            }     }      @Override     public boolean onOptionsItemSelected(MenuItem item) {           // Handle item selection           switch (item.getItemId()) {           case R.id.action_settings:                MenuClick();           default:                return super.onOptionsItemSelected(item);           }     }      private class ViewHolder {           TextView tvSname;      }      class MyAdapter extends ArrayAdapter<String> {           LayoutInflater inflater;           Context myContext;           List<String> newList;     public MyAdapter(Context context, int resource, List<String> list) {                super(context, resource, list);                // TODO Auto-generated constructor stub                 myContext = context;                newList = list;                inflater = LayoutInflater.from(context);           }            @Override  public View getView(final int position, View view, ViewGroup parent) {                final ViewHolder holder;                if (view == null) {                     holder = new ViewHolder();               view = inflater.inflate(R.layout.listview_item, null);           holder.tvSname = (TextView) view.findViewById(R.id.tvTitle);                     view.setTag(holder);                } else {                     holder = (ViewHolder) view.getTag();                }            holder.tvSname.setText(newList.get(position).toString());                 return view;           }     } } 
```

Now run your application

\
![Custom Media player in Android](https://www.mindstick.com/mindstickarticle/7b67c417-e697-4ffe-af03-912071353272/images/d65ed89c-dd82-4802-9374-b2cbe39bb62f.png)

You can choose song from click playlist on top right

![Custom Media player in Android](https://www.mindstick.com/mindstickarticle/7b67c417-e697-4ffe-af03-912071353272/images/a4fdf263-cee7-4b9a-b176-3d7a0be18799.png)

---

Original Source: https://www.mindstick.com/articles/1667/custom-media-player-in-android

Copyright © MindStick Software Pvt. Ltd. This Markdown version is provided for developers, AI systems, and offline reading.
