Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - Playing mp3 from byte[]

I have my mp3 file in byte[] (downloaded from an service) and I would like to play it on my device similar to how you can play files:

MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start(); 

But I can't seem to find a way to do it. I wouldn't mind saving file to phone and then playing it. How can I play the file, or download then play it?

like image 656
nikib3ro Avatar asked Dec 28 '09 23:12

nikib3ro


2 Answers

OK, thanks to all of you but I needed to play mp3 from byte[] as I get that from .NET webservice (don't wish to store dynamically generated mp3s on server).

In the end - there are number of "gotchas" to play simple mp3... here is code for anyone who needs it:

private MediaPlayer mediaPlayer = new MediaPlayer(); private void playMp3(byte[] mp3SoundByteArray) {     try {         // create temp file that will hold byte array         File tempMp3 = File.createTempFile("kurchina", "mp3", getCacheDir());         tempMp3.deleteOnExit();         FileOutputStream fos = new FileOutputStream(tempMp3);         fos.write(mp3SoundByteArray);         fos.close();          // resetting mediaplayer instance to evade problems         mediaPlayer.reset();          // In case you run into issues with threading consider new instance like:         // MediaPlayer mediaPlayer = new MediaPlayer();                               // Tried passing path directly, but kept getting          // "Prepare failed.: status=0x1"         // so using file descriptor instead         FileInputStream fis = new FileInputStream(tempMp3);         mediaPlayer.setDataSource(fis.getFD());          mediaPlayer.prepare();         mediaPlayer.start();     } catch (IOException ex) {         String s = ex.toString();         ex.printStackTrace();     } } 

EDIT: I've wrote this answer more than 4 years ago - obviously lots of things have changed since then. See Justin's comment on how to reuse MediaPlayer instance. Also, I don't know if .deleteOnExit() will work for you now - feel free to suggest improvement so that temp files do not pile up.

like image 186
nikib3ro Avatar answered Sep 22 '22 12:09

nikib3ro


I found an easy solution by encoding my MP3 file as Base64 (I already receive the data encoded from a Restful API service), and then creating a URL object. I tested it in Android 4.1.

public void PlayAudio(String base64EncodedString){         try         {             String url = "data:audio/mp3;base64,"+base64EncodedString;              MediaPlayer mediaPlayer = new MediaPlayer();             mediaPlayer.setDataSource(url);             mediaPlayer.prepare();             mediaPlayer.start();         }         catch(Exception ex){             System.out.print(ex.getMessage());         }     } 
like image 29
Max Vargas Avatar answered Sep 22 '22 12:09

Max Vargas