Android MediaPlayer How to Play Audio

  • 2021-11-13 02:41:32
  • OfStack

This paper mainly introduces the way of playing audio using MediaPlayer. For basic knowledge of MediaPlayer, such as state, refer to the basic introduction of Android MediaPlayer.

For convenience of expression, define the variable name mediaPlayer.

How to use MediaPlayer

Create MediaPlayer

It can be created directly by new MediaPlayer or by create method provided by MediaPlayer.

mediaPlayer = new MediaPlayer();

After successful creation using the create method, mediaPlayer is in the Prepared state. It can be played directly by start.


mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));
mediaPlayer.start();

Setting Sound Source-setDataSource

Set the sound source by calling setDataSource. setDataSource has several overloaded methods. Let's look at some of the common ones.

For example, set up to use resources in assets. The actual situation may require try catch.


AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());

Local file, the absolute path of the file is required.


mediaPlayer.setDataSource(file.getAbsolutePath());

Or get the Uri of the file to create mediaPlayer.


mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));

Set up network audio, also use setDataSource method, set url.

mediaPlayer.setDataSource("https://demo.com/sample.mp3"));

When playing network audio, if you use http, you may report an error


java.io.IOException: Cleartext HTTP traffic to demo.com not permitted

You can simply set manifest under 1 and set usesCleartextTraffic=”true”


<application
 android:usesCleartextTraffic="true">

Ready-prepare

Prepare audio resources synchronously and asynchronously. prepareAsync() Is asynchronous, and prepare is synchronous. Pay attention to thread scheduling problems and do not block UI threads.

Prepare audio asynchronously, often with MediaPlayer.OnPreparedListener The listener is used together. Other settings can also be made when preparing asynchronously.


mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
 @Override
 public void onPrepared(MediaPlayer mediaPlayer) {
 mediaPlayer.start(); //  Play it when you're ready 
 }
});

Loop Play-Looping

Set the loop to play setLooping.

mediaPlayer.setLooping(true);

After playing, OnCompletionListener will not be called back, but the current audio will be played from scratch.

Play-start

Play the audio and call the start method.

mediaPlayer.start();

When you are in the Prepared, Pause, and PlaybackComplete states, you can call the start method to enter the Started state.

Pause-pause

Pause playback and use the pause method. Before pausing, judge whether mediaPlayer is playing under 1.


if (mediaPlayer.isPlaying()) {
 mediaPlayer.pause();
}

If the pause is successful, it will be in Paused state.

Stop-stop

Looking back at the diagram of MediaPlayer state switching in 1, we can know that stop method can be called to enter Stopped state in three states: playing, pausing and playing completed.

mediaPlayer.stop();

Scheduling-seekTo

Adjust the playback progress. We usually use music playing software 1 will have this function.
The seekTo method accepts 1 millisecond parameter.


int targetMS = (int) (percent * mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);

seekTo does not change the state of MediaPlayer.


int targetMS = (int) (percent * mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);

mediaPlayer after reset enters Idle state. Need to reset the sound source and prepare.

Release-release

When this mediaPlayer is no longer used, it should be released as soon as possible to free up related resources.

After calling release, mediaPlayer enters End state. At this time, this mediaPlayer can no longer be used.

Common listener

Buffer Listener OnBufferingUpdateListener

For example, when we load network audio, we often use this listener to monitor the buffer progress. Displaying buffer progress can also improve the user experience.


AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
0

Error Listener OnErrorListener


AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
1

Note the return value of onError. You can choose to handle error yourself.


AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
2

Finished Play Listener OnCompletionListener


mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
 @Override
 public void onCompletion(MediaPlayer mediaPlayer) {
 //  Play finished 
 }
});

Use sample

Play audio from assets

Play the audio files in assets and use the AssetFileDescriptor class. Remember to turn off AssetFileDescriptor after use.


AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
4

Play local audio files

Try playing an audio file. Play only once.


AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
5

Play audio online

Set url to play online audio


AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
6

The code can refer to the sample project: https://github.com/RustFisher/android-MediaPlayer

Summarize


Related articles: