Android MediaPlayer 播放音频的方式

Android MediaPlayer 播放音频的方式,第1张

概述Android MediaPlayer 播放音频方式 主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer基础简介. 为了方便表达,定义变量名为mediaPlayer. MediaPlayer的使用方式 创建MediaPlayer 可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法创建. mediaPlayer = new MediaPlayer(); 使用create方法创建成功后,mediaPlayer处于Pr

主要介绍使用MediaPlayer播放音频的方式。关于MediaPlayer的基础知识,比如状态,可以参考AndroID MediaPlayer基础简介。

为了方便表达,定义变量名为mediaPlayer。

MediaPlayer的使用方式

创建MediaPlayer

可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法创建。

mediaPlayer = new MediaPlayer();

使用create方法创建成功后,mediaPlayer处于Prepared状态。可以直接start播放。

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

设置音源 - setDataSource

通过调用setDataSource来设置音源。setDataSource有多个重载方法,我们来看常用的几种。

例如设置使用assets里的资源。实际情况可能需要try catch。

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

本地文件,需要文件的绝对路径。

mediaPlayer.setDataSource(file.getabsolutePath());

或者获取文件的Uri来创建mediaPlayer。

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

设置网络音频,也是用setDataSource方法,设置url。

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

播放网络音频时,如果使用的是http,有可能会报错

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

可以简单地设置一下manifest,设置usesCleartextTraffic=”true”

<application androID:usesCleartextTraffic="true">

准备 - prepare

同步和异步准备音频资源。prepareAsync()是异步的方式,prepare是同步的。注意线程调度问题,同时不要阻塞UI线程。

使用异步方式准备音频,经常与MediaPlayer.OnPreparedListener监听器配合使用。异步准备时,也可以进行其他的设置。

mediaPlayer.prepareAsync();mediaPlayer.setonPreparedListener(new MediaPlayer.OnPreparedListener() { @OverrIDe public voID onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); // 准备好了就播放 }});

循环播放 - LooPing

设置循环播放setLooPing。

mediaPlayer.setLooPing(true);

播放完毕后,不会回调OnCompletionListener,而是从头播放当前音频。

播放 - start

播放音频,调用start方法。

mediaPlayer.start();

处于Prepared,Pause和PlaybackComplete状态时,可以调用start方法,进入Started状态。

暂停 - pause

暂停播放,使用pause方法。在暂停前先判断一下mediaPlayer的是否在播放。

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

暂停成功则处于Paused状态。

停止 - stop

回顾一下MediaPlayer状态切换的图示,我们可以得知在播放中,暂停,播放完成这3个状态下,可以调用stop方法,进入Stopped状态。

mediaPlayer.stop();

调进度 - seekTo

调整播放进度。我们平时使用音乐播放软件一般都会有这个功能。
seekTo方法接受一个毫秒参数。

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

seekTo并不会改变MediaPlayer的状态。

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

reset后的mediaPlayer进入IDle状态。需要重新设置音源与准备。

释放 - release

不再使用这个mediaPlayer时,应当尽快释放掉,以释放相关的资源。

调用release后,mediaPlayer进入End状态。此时这个mediaPlayer就不能再使用了。

常用监听器

缓冲监听器 OnBufferingUpdateListener

比如我们加载网络音频的时候,常用这个监听器来监听缓冲进度。显示缓冲进度,也可以提高用户体验。

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

错误监听器 OnErrorListener

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

注意onError的返回值。可以选择自己处理error。

 * @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);

播放完毕监听器 OnCompletionListener

mediaPlayer.setonCompletionListener(new MediaPlayer.OnCompletionListener() { @OverrIDe public voID onCompletion(MediaPlayer mediaPlayer) { // 播放完毕 }});

使用示例

播放assets里的音频

播放assets里的音频文件,使用到AssetfileDescriptor类。使用后记得关闭AssetfileDescriptor。

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);  } } }}

播放本地音频文件

尝试播放音频文件。仅播放一次。

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); }}

播放在线音频

设置url,播放在线音频

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); }}

代码可以参考示例工程: https://github.com/RustFisher/android-MediaPlayer

总结

以上所述是小编给大家介绍的AndroID MediaPlayer 播放音频的方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

总结

以上是内存溢出为你收集整理的Android MediaPlayer 播放音频的方式全部内容,希望文章能够帮你解决Android MediaPlayer 播放音频的方式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1145739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存