How Android mediaplayer plays audio

It mainly introduces how to play audio with mediaplayer. For the basic knowledge of mediaplayer, such as status, please refer to the introduction to Android mediaplayer.

For ease of expression, define the variable named mediaplayer.

How mediaplayer is used

Create mediaplayer

You can directly create new mediaplayer or use the Create method provided by mediaplayer.

mediaPlayer = new MediaPlayer();

After the Create method is successfully used, the mediaplayer is in the prepared state. You can start playing directly.

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

Set sound source - setdatasource

Set the sound source by calling setdatasource. Setdatasource has multiple overloaded methods. Let's look at several commonly used methods.

For example, set and use the resources in assets. Try catch may be required in actual situations.

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 a mediaplayer.

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

To set the network audio, use the setdatasource method to set the URL.

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

When playing network audio, if HTTP is used, an error may be reported

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

You can simply set the manifest and set usesclleartexttraffic = "true"

<application
 android:usesCleartextTraffic="true">

Prepare - prepare

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

Prepare audio asynchronously, often in conjunction with the mediaplayer.onpreparedlistener listener listener. Other settings can also be made during asynchronous preparation.

mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
 @Override
 public void onPrepared(MediaPlayer mediaPlayer) {
 mediaPlayer.start(); // 准备好了就播放
 }
});

Looping - looping

Set looping setlooping.

mediaPlayer.setLooping(true);

After playing, the oncompletionlistener will not be called back, but the current audio will be played from the beginning.

Play - start

Play the audio and call the start method.

mediaPlayer.start();

When 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, check whether the mediaplayer is playing.

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

If the pause is successful, it is in the paused state.

Stop - stop

Reviewing the diagram of mediaplayer state switching, we can know that in the three states of playing, pause and completion, you can call the stop method to enter the stopped state.

mediaPlayer.stop();

Progress adjustment - seekto

Adjust playback progress. We usually use music playing software, which generally has this function. The seekto method accepts a 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);

The mediaplayer after reset enters the idle state. You need to reset the sound source and prepare.

Release - release

When the mediaplayer is no longer used, it should be released as soon as possible to release relevant resources.

After calling release, mediaplayer enters the end state. At this point, the 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 the buffer progress can also improve the user experience.

mMediaPlayer.prepareAsync();
mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
 @Override
 public void onBufferingUpdate(MediaPlayer mp,int percent) {
 // percent代表缓冲百分比
 }
});

Error listener onerrorlistener

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
 @Override
 public boolean onError(MediaPlayer mediaPlayer,int i,int i1) {
 return true; // 返回true表示在此处理错误,不会回调onCompletion
 }
});

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

 * @return True if the method handled the error,false if it didn't.
 * Returning false,or not having an OnErrorListener at all,will
 * cause the OnCompletionListener to be called.
 */
boolean onError(MediaPlayer mp,int what,int extra);

Completion listener oncompletionlistener

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
 @Override
 public void onCompletion(MediaPlayer mediaPlayer) {
 // 播放完毕
 }
});

Use example

Play the audio in assets

Play the audio files in assets and use the assetfiledescriptor class. Remember to close assetfiledescriptor after use.

private void playAssetsAudio(final String name,Context context) {
 Log.d(TAG,"playAssetWordSound: try to play assets sound file. -> " + name);
 AssetFileDescriptor fd = null;
 try {
 MediaPlayer mediaPlayer;
 Log.v(TAG,"Looking in assets.");
 fd = context.getApplicationContext().getAssets().openFd(name);
 mediaPlayer = new MediaPlayer();
 mediaPlayer.reset();
 mediaPlayer.setDataSource(fd.getFileDescriptor(),fd.getLength());
 mediaPlayer.prepareAsync();
 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  @Override
  public void onPrepared(MediaPlayer mediaPlayer) {
  Log.d(TAG,"onPrepared: " + name);
  mediaPlayer.start();
  }
 });
 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  @Override
  public void onCompletion(MediaPlayer mp) {
  mp.release();
  Log.d(TAG,"onCompletion: " + name);
  }
 });
 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
  @Override
  public boolean onError(MediaPlayer mp,int i1) {
  mp.release();
  return true;
  }
 });
 } catch (Exception e) {
 try {
  if (fd != null) {
  fd.close();
  }
 } catch (Exception e1) {
  Log.e(TAG,"Exception close fd: ",e1);
 }
 } finally {
 if (fd != null) {
  try {
  fd.close();
  } catch (IOException e) {
  Log.e(TAG,"Finally,close fd ",e);
  }
 }
 }
}

Play local audio files

Try playing an audio file. Play only once.

private void playAudioFile(final File file) {
 Log.d(TAG,"playAudioFile: " + file.getAbsolutePath());
 MediaPlayer mediaPlayer;
 try {
 mediaPlayer = new MediaPlayer();
 mediaPlayer.setLooping(false);
 mediaPlayer.setDataSource(file.getAbsolutePath());
 mediaPlayer.prepare();
 mediaPlayer.start();
 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  @Override
  public void onCompletion(MediaPlayer mp) {
  mp.release();
  }
 });
 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
  @Override
  public boolean onError(MediaPlayer mediaPlayer,int i1) {
  Log.d(TAG,"Play local sound onError: " + i + "," + i1);
  return true;
  }
 });
 } catch (Exception e) {
 Log.e(TAG,"playAudioFile: ",e);
 }
}

Play online audio

Set URL to play online audio

private void playOnlineSound(String soundUrlDict) {
 try {
 MediaPlayer mediaPlayer = new MediaPlayer();
 mediaPlayer.setDataSource(soundUrlDict);
 mediaPlayer.prepareAsync();
 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  @Override
  public void onPrepared(MediaPlayer mediaPlayer) {
  mediaPlayer.start();
  }
 });
 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  @Override
  public void onCompletion(MediaPlayer mp) {
  if (mp != null) {
   mp.release();
  }
  Log.d(TAG,"onCompletion: play sound.");
  }
 });
 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
  @Override
  public boolean onError(MediaPlayer mediaPlayer,"Play online sound onError: " + i + "," + i1);
  return false;
  }
 });
 } catch (IOException e1) {
 Log.e(TAG,"url: ",e1);
 }
}

Refer to the example project for code: https://github.com/RustFisher/android-MediaPlayer

summary

The above is the way Android mediaplayer plays audio introduced by Xiaobian. I hope it will help you. If you have any questions, please leave me a message, and Xiaobian will reply to you in time. Thank you very much for your support to our website! If you think this article is helpful to you, welcome to reprint, please indicate the source, thank you!

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>