本文链接: Android MediaPlayer 播放音频

主要介绍使用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"

<applicationandroid:usesCleartextTraffic="true">

准备 - prepare

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

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

    mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic 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的状态。

重置 - reset

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

释放 - release

不再使用这个mediaPlayer时,应当尽快释放掉,以释放相关的资源。
调用release后,mediaPlayer进入End状态。此时这个mediaPlayer就不能再使用了。

常用监听器

缓冲监听器 OnBufferingUpdateListener

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

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

错误监听器 OnErrorListener

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic 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() {@Overridepublic 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.getStartOffset(), fd.getLength());mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mediaPlayer) {Log.d(TAG, "onPrepared: " + name);mediaPlayer.start();}});mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {mp.release();Log.d(TAG, "onCompletion: " + name);}});mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mp, int i, 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() {@Overridepublic void onCompletion(MediaPlayer mp) {mp.release();}});mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mediaPlayer, int i, 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() {@Overridepublic void onPrepared(MediaPlayer mediaPlayer) {mediaPlayer.start();}});mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {if (mp != null) {mp.release();}Log.d(TAG, "onCompletion: play sound.");}});mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mediaPlayer, int i, int i1) {Log.d(TAG, "Play online sound onError: " + i + ", " + i1);return false;}});} catch (IOException e1) {Log.e(TAG, "url: ", e1);}}

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

转载于:https://www.cnblogs.com/rustfisher/p/11568524.html

Android MediaPlayer 播放音频相关推荐

  1. android播放mp3方法,Android MediaPlayer 播放音频的方式

    主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer基础简介. 为了方便表达,定义变量名为mediaPlay ...

  2. mediaplayer android mp3 url,Android MediaPlayer 播放音频

    主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer 基础简介 为了方便表达,定义变量名为mediaPlay ...

  3. android 定时播放wav,Android MediaPlayer播放音频与视频

    播放音频 首先创建出一个MediaPlayer对象 MediaPlayer mMediaPlayer = new MediaPlayer(); 设置声音源 public static final St ...

  4. android播放mp3方法,Android之MediaPlayer播放音频与视频

    本节带来的是Android多媒体中的--MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放 ...

  5. Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.使用录音机录制音频 手机有自带的系统相机,也有自带的系统录音机,只要在调用startActivityForResult之前指定该动作,就会自动 ...

  6. Android 使用MediaPlayer播放音频详解

    目录 一.官方资料 二.简单介绍 三.MediaPlayer使用 1.创建MediaPlayer实例 2.重要API 3.状态图 4.代码 5.常用API 6.辅助效果 总结 一.官方资料 Media ...

  7. Android使用MediaPlayer播放音频

    Android使用MediaPlayer播放音频 一.目标 二.最终实现 三.接下来 四.Finally 开发<Android高仿iOS Messages声音播放波形效果>完成后,Tape ...

  8. android全格式多媒体播放器,Android多媒体应用使用MediaPlayer播放音频

    Android提供了对常用音频和视频格式的支持,它所支持的音频格式有MP3(.mp3).3GPP(.3gp).Ogg(.ogg)和WAVE(.ave)等,支持的视频格式有3GPP(.3gp)和MPEG ...

  9. 我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器

    大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上 ...

最新文章

  1. PHP常用功能块_错误和异常处理 — php(32)
  2. VTK:绘图之SpiderPlot
  3. bat/cmd 抛出错误码和捕获错误
  4. Oracle with语句的用法
  5. [LeetCode] Search in Rotated Sorted Array
  6. 实木地板被机器人弄成坑_实木地板的常规保养
  7. android studio学习----通过github的URL怎么导入新的工程
  8. 如果降低sbus总线的传输速率/帧率,sbus怎样转UART,sbus接到4G
  9. jquery中ajax应用——load()函数
  10. Webgoat学习笔记1
  11. 第16课:郭盛华课程PHP文件打开,读取
  12. 小米平板4刷recovery教程_米板4解锁刷机教程
  13. 第8章 中医证型关联规则挖掘代码调整
  14. Swift语法基础:19 - Swift的控制转移的语句, Continue, Break, Fallthrough, Labeled Statements...
  15. 【web前端特效源码】使用 HTMLCSSJavaScript实现各种跳跃浮动慢跑翻转旋转坠落的魔幻文字动画效果~太上头了~/动画效果|前端开发|IT软件开发基础入门教程|网页制作|网站开发定制
  16. windows10 Centos双系统安装且启动修复引导
  17. CString 判断存在中文,大小写字母及标点
  18. ISME:南农张瑞福组揭示芽孢杆菌通过代谢互作刺激常驻根际微生物促进植物生长!...
  19. 福光电子蓄电池测试仪软件,IDCE-2415CT高压直流系统蓄电池容量测试仪-福光电子...
  20. Decorate和Proxy模式

热门文章

  1. 用虚拟机配置Linux实验环境
  2. python-----学习资料
  3. 2018-2019-1 20165227 20165228 20165237 实验五 通讯协议设计
  4. 剑指offer38 数字在排序数组中出现的次数
  5. eclipse常见小问题
  6. 解决XCode安装插件后插件不能使用的问题(转载)
  7. 【TypeScript】TypeScript 学习 4——模块
  8. wcf rest服务启用gzip压缩
  9. DataList多行数据后如何添加一条分隔线
  10. ASP.NET 程序中常用的三十三种代码(1)