在Android MediaPlayer的简单使用一文中,对MediaPlayer的操作都是同步的,但在实际开发中往往无法满足需求。例如,当调用prepare()时,MediaPlayer会对媒体资源进行解码等一系列操作,可能会花费相当长的时间,如果是同步的话,会导致ANR异常,而且经常无法正常播放。所以有需要异步使用MediaPlayer。
根据官方文档,可知MediaPlayer有一个内部状态,有些操作只能在特殊的状态下才能进行,不然会出错。MediaPlayer的状态在被创建时处于“空闲状态”,通过调用setDataSource()进入到“初始化状态”,再通过调用 prepare()或 prepareAsync()进入“准备状态”,最后调用start()进入“播放状态”;在“播放状态”时,可调用 start(), pause(), seekTo()这三个方法让状态在“播放”,“已暂停”和“回放完成”状态之间移动;但如果调用了stop()后,不能直接调用start()进入“播放状态”,必须调用prepare()或 prepareAsync()从“准备状态”开始。
MediaPlayer会占用到系统资源,所以当它不再被需要时释放掉它。
player.release();
player = null;
- 播放代码
-
MediaPlayer player=new MediaPlayer(); if (player == null) player = new MediaPlayer(); //设置媒体资源的类型为音乐 player.setAudioStreamType(AudioManager.STREAM_MUSIC); try { //使用URL获取媒体资源,URL对应的资源必须能逐行下载 //使用setDataSource可能会出现资源不存在的情况,所以必须抛出异常 //musicUrl:媒体资源的URL player.setDataSource(musicUrl); player.prepareAsync(); //异步 } catch (IOException e) { e.printStackTrace(); } //为播放器设置监听器,用于监听prepareAsync的状态,当准备完成时播放 player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } });
调用prepareAsync方法,必须在监听器中调用start()进行播放,否则会报错。
注:参考文档https://developer.android.google.cn/guide/topics/media/mediaplayer.html#manifest