Streaming Audio from A URL in Android using MediaPlayer? Streaming Audio from A URL in Android using MediaPlayer? android android

Streaming Audio from A URL in Android using MediaPlayer?


simple Media Player with streaming example.For xml part you need one button with id button1 and two images in your drawable folder with name button_pause and button_play and please don't forget to add the internet permission in your manifest.

public class MainActivity extends Activity {private Button btn;/** * help to toggle between play and pause. */private boolean playPause;private MediaPlayer mediaPlayer;/** * remain false till media is not completed, inside OnCompletionListener make it true. */private boolean intialStage = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    btn = (Button) findViewById(R.id.button1);    mediaPlayer = new MediaPlayer();    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);    btn.setOnClickListener(pausePlay);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.activity_main, menu);    return true;}private OnClickListener pausePlay = new OnClickListener() {    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        // TODO Auto-generated method stub        if (!playPause) {            btn.setBackgroundResource(R.drawable.button_pause);            if (intialStage)                new Player()                        .execute("http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3");            else {                if (!mediaPlayer.isPlaying())                    mediaPlayer.start();            }            playPause = true;        } else {            btn.setBackgroundResource(R.drawable.button_play);            if (mediaPlayer.isPlaying())                mediaPlayer.pause();            playPause = false;        }    }};/** * preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread. * @author piyush * */class Player extends AsyncTask<String, Void, Boolean> {    private ProgressDialog progress;    @Override    protected Boolean doInBackground(String... params) {        // TODO Auto-generated method stub        Boolean prepared;        try {            mediaPlayer.setDataSource(params[0]);            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {                @Override                public void onCompletion(MediaPlayer mp) {                    // TODO Auto-generated method stub                    intialStage = true;                    playPause=false;                    btn.setBackgroundResource(R.drawable.button_play);                    mediaPlayer.stop();                    mediaPlayer.reset();                }            });            mediaPlayer.prepare();            prepared = true;        } catch (IllegalArgumentException e) {            // TODO Auto-generated catch block            Log.d("IllegarArgument", e.getMessage());            prepared = false;            e.printStackTrace();        } catch (SecurityException e) {            // TODO Auto-generated catch block            prepared = false;            e.printStackTrace();        } catch (IllegalStateException e) {            // TODO Auto-generated catch block            prepared = false;            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            prepared = false;            e.printStackTrace();        }        return prepared;    }    @Override    protected void onPostExecute(Boolean result) {        // TODO Auto-generated method stub        super.onPostExecute(result);        if (progress.isShowing()) {            progress.cancel();        }        Log.d("Prepared", "//" + result);        mediaPlayer.start();        intialStage = false;    }    public Player() {        progress = new ProgressDialog(MainActivity.this);    }    @Override    protected void onPreExecute() {        // TODO Auto-generated method stub        super.onPreExecute();        this.progress.setMessage("Buffering...");        this.progress.show();    }}@Overrideprotected void onPause() {    // TODO Auto-generated method stub    super.onPause();    if (mediaPlayer != null) {        mediaPlayer.reset();        mediaPlayer.release();        mediaPlayer = null;    }}


Android MediaPlayer doesn't support streaming of MP3 natively until 2.2. In older versions of the OS it appears to only stream 3GP natively. You can try the pocketjourney code, although it's old (there's a new version here) and I had trouble making it sticky — it would stutter whenever it refilled the buffer.

The NPR News app for Android is open source and uses a local proxy server to handle MP3 streaming in versions of the OS before 2.2. You can see the relevant code in lines 199-216 (r94) here: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/PlaybackService.java?r=7cf2352b5c3c0fbcdc18a5a8c67d836577e7e8e3

And this is the StreamProxy class: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java?r=e4984187f45c39a54ea6c88f71197762dbe10e72

The NPR app is also still getting the "error (-38, 0)" sometimes while streaming. This may be a threading issue or a network change issue. Check the issue tracker for updates.


I guess that you are trying to play an .pls directly or something similar.

try this out:

1: the code

mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3"));mediaPlayer.start();

2: the .pls file

This URL is from BBC just as an example. It was an .pls file that on linux i downloaded with

wget http://foo.bar/file.pls

and then i opened with vim (use your favorite editor ;) and i've seen the real URLs inside this file. Unfortunately not all of the .pls are plain text like that.

I've read that 1.6 would not support streaming mp3 over http, but, i've just tested the obove code with android 1.6 and 2.2 and didn't have any issue.

good luck!