I spent all day figuring out how to play a mp3 file in my Android app. Before you start to question my programming skills (which is fine) let me add a few requirements:
1. The sound file is contained in a subdirectory within my assets
2. The code should work for external assets outside of the bundle as well as assets within the bundle. For this reason I didn’t want to use resource ids.
3. The file should be streamed and not loaded entirely into memory.
The MediaPlayer seems like the best option to use and I immediately tried coding to that. I spent most of the time trying to get the Uri implementation to work (ex: “file:///android_asset/sounds/music.mp3”) but that just refused to work for me.
I was able to use the AssetManager to get a AssetFileDescriptor which can give you a FileDescriptor that can be used as a data source for the MediaPlayer.
Here is the code:
// get the asset file descriptor from our context
AssetFileDescriptor afd = mContext.getAssets().openFd(filename);
// media player created in idle state (always call setDataSource next)
MediaPlayer mp = new MediaPlayer();
// setting data source puts media player into the initialized state
mp.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(),
afd.getLength());
// setting of looping should be done in the initialized or
// prepared state (not idle state)
mp.setLooping(false);
// prepare required before calling start or stop methods
mp.prepare();
// listeners require running on the ui thread
mp.setOnCompletionListener(new OnCompletionListener()
{
public void onCompletion(MediaPlayer mp)
{
mp.release();
}
});
// finally play it
mp.start();
// cleanup afd
afd.close();