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 的状态。
重置 - reset
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); } }
【Android音视频开发系列教程】