主要介绍使用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.getStartOffset(), 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 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() { @Override public void onCompletion(MediaPlayer mp) { mp.release(); } }); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public 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() { @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, 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
总结
以上所述是小编给大家介绍的Android MediaPlayer 播放音频的方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
音频的加载方式请参考:声音资源 使用 AudioSource 组件播放 在 层级管理器 上创建一个空节点 选中空节点,在 属性检查器 最下方点击 添加组件 -> 其他组件 -> AudioSource 来添加 AudioSource 组件 将 资源管理器 中所需的音频资源拖拽到 AudioSource 组件的 Clip 中,如下所示: 然后根据需要对 AudioSource 组件的其他参数项进行设
本文向大家介绍web-audio 播放音频,包括了web-audio 播放音频的使用技巧和注意事项,需要的朋友参考一下 示例 要使用Web Audio API播放音频,我们需要获取音频数据的ArrayBuffer并将其传递给BufferSource进行播放。 要获得播放声音的音频缓冲区,您需要使用如下AudioContext.decodeAudioData方法: 最终承诺解决后,系统会以的形式为您
音频播放组件,代替原生的 audio 标签 标题 内容 类型 通用 支持布局 N/S 所需脚本 https://c.mipcdn.com/static/v2/mip-audio/mip-audio.js mip-audio 用法和原生标签的用法基本相同,有所不同的是在 MIP 环境下,初始化的时间是由 MIP Runtime 决定,只有当标签在浏览器视窗内才会初始化,也就是所谓的懒加载。 mip-
概述 音频播放模块兼容全系列makeblock主控板,内置语音解码芯片,可以播放音乐及录音。本模块接口是白色色标,说明是I2C信号控制,需要连接到主板上带有白色标识接口。插入TF内存卡即可感受音乐的快乐,使用起来非常方便。 技术规格 工作电压:5V DC 麦克风灵敏度(1Khz):50-54dB 麦克风阻抗:2.2 kΩ 麦克风信噪比:58 db 喇叭额定功率:1W 喇叭额定阻抗:8±15%Ω 通
我正在开发一个包含一些音频播放器的RecyclerView的应用程序。应用程序将下载。3gp文件(如果尚未下载)。 当我单击playAudio按钮时,音频未被播放。 这是我的适配器代码: 我怎样才能解决这个问题?
我有listview,它包含一个带有播放按钮和搜索栏的音频文件列表。 当我单击listview的播放按钮时,我想播放一个音频文件。我成功地实现了这一点,但当我单击列表中的另一个播放按钮时,两个音频文件正在连续播放,它将继续所有单击播放按钮。我如何限制媒体播放器在一个位置播放,如果我点击另一个图标,它必须停止旧的媒体播放器,并开始播放新的。有人能说我怎么实现这个吗?。我有相同的按钮播放和暂停。