Android MediaPlayer的简单使用(二)

在Android MediaPlayer的简单使用一文中,对MediaPlayer的操作都是同步的,但在实际开发中往往无法满足需求。例如,当调用prepare()时,MediaPlayer会对媒体资源进行解码等一系列操作,可能会花费相当长的时间,如果是同步的话,会导致ANR异常,而且经常无法正常播放。所以有需要异步使用MediaPlayer。

根据官方文档,可知MediaPlayer有一个内部状态,有些操作只能在特殊的状态下才能进行,不然会出错。MediaPlayer的状态在被创建时处于“空闲状态”,通过调用setDataSource()进入到“初始化状态”,再通过调用 prepare()或 prepareAsync()进入“准备状态”,最后调用start()进入“播放状态”;在“播放状态”时,可调用 start(), pause(), seekTo()这三个方法让状态在“播放”,“已暂停”和“回放完成”状态之间移动;但如果调用了stop()后,不能直接调用start()进入“播放状态”,必须调用prepare()或 prepareAsync()从“准备状态”开始。MediaPlayer的状态图

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值