简析Android mediaPlayer 播放在线音乐网络异常状态的处理

本文分享了在开发Android音乐播放器时,如何处理在线音乐播放过程中的网络异常,包括网速慢、加载超时和网络断开等问题,以提升用户体验。通过具体的代码示例,探讨了如何实现稳定播放的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    菜鸟遇到的一点小问题,和大家分享~

    最近在做音乐播放器,需要在线播放音乐,需要针对播放过程中的网络异常做处理(网速较慢、加载超时、网络连接断开),以提高音乐播放的用户体验。很多内容都是从网上google学会的,一些搜不到的内容自己摸索的结果在这里和大家交流一下~

在线播放音乐的代码如下:

mp.reset();
mp.setDataSource(url);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
   @Override
   public boolean onError(MediaPlayer mp, int what, int extra) {
      Toast.makeText(getApplicationContext(), "播放错误!", Toast.LENGTH_SHORT).show();
      return true;
   }
});
mp.start();
    一开始的代码是以上这样的。
    查看官方的文档给mediaplayer对象设置了一个OnErrorListener监听器实现了onError方法,在这个方法中做错误处理。
    然而经过试验,这样子并不能捕捉到网络异常的情况,比如音乐加载了一半手动断开网络,当播放完加载的内容后,此时并不会触发onError方法,而是停在未加载的位置一直等待加载。
    上网搜了很多文章都没有找到相应的解决方法,最后只好自己试试,最后解决办法如下:
    
mp.reset();
mp.setDataSource(url);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepareAsync();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
   @Override
   public void onPrepared(MediaPlayer mp) {
      mBufferProgress = 0;
      mp.start();
   }
});

mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
   @Override
   public boolean onError(MediaPlayer mp, int what, int extra) {
      Toast.makeText(getApplicationContext(), "播放错误!", Toast.LENGTH_SHORT).show();
      return true;
   }
});
    如上,只需把mp.prepare换成mp.prepareAsync();并在OnPreparedListener()中启动音乐播放就可以成功监听播放过程中的网络异常情况。
    官方看了一下prepareAsync()是异步加载的意思,具体的细节我也没看完,下一步研究研究~
   public void prepare()
     
Added in  API level 1

Prepares the player for playback, synchronously. After setting the datasource and the display surface, you need to either call prepare() or prepareAsync(). For files, it is OK to call prepare(), which blocks until MediaPlayer is ready for playback.

public void prepareAsync ()
Added in  API level 1

Prepares the player for playback, asynchronously. After setting the datasource and the display surface, you need to either call prepare() or prepareAsync(). For streams, you should call prepareAsync(), which returns immediately, rather than blocking until enough data has been buffered.

大意是 prepare()需要准备足够的数据才开始播放, prepareAsync马上播放。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值