【Android】 使用 MediaPlayer 播放声音

前言:
使用MediaPlayer调用raw文件夹里面的声音。

1.创建MediaPlayer

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.ring);

因为是用这种 MediaPlayer.create 方式创建的,所以不需要调用 prepare 方法。

需要播放声音时:

mediaPlayer.start();

当需要重复播放声音时:

//设置循环播放
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
   public void onCompletion(MediaPlayer mp) {
          mediaPlayer.start();
   }
});

需要暂停播放声音时:

mediaPlayer.pause();

需要停止播放声音时:

 mediaPlayer.stop();

当我们首次播放声音时,不需要 prepare ,但是当需要再次播放时,需要先 prepare 才能使用,一般会在 start 之前或者 stop 方法之后调用 prepare 方法。我比较喜欢在 stop 之后调用 prepare方法。

try {
   mediaPlayer.prepare();
   } catch (IOException e) {
    e.printStackTrace();
}

有时候我们需要判断声音是否在播放中,当处于播放状态时,停止播放声音,MediaPlayer 提供了 isPlaying 方法来判断是否在播放状态。

mediaPlayer.isPlaying()

但是在使用此方法的时候,经常会出现明明在播放声音,但是 isPlaying 方法返回 false的情况。
这是因为 isPlaying 是异步方法,如果频繁的调用 start 和 stop 方法,就会出现上述问题。
解决办法:
我们自己定义一个 boolean 变量:

private boolean isPlayingRing = false;

在需要使用的时候:

if (isPlayingRing || mediaPlayer.isPlaying()) {
   mediaPlayer.stop();
   isPlayingRing = false;
   try {
       mediaPlayer.prepare();
       } catch (IOException e) {
           e.printStackTrace();
       }
 }

有时候我们会遇到这类错误

Error (-38, 0)
stop called in state 0

解决方式:

 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
     @Override
     public boolean onError(MediaPlayer mp, int what, int extra) {
            mediaPlayer.reset();
            return true;
            }
 });

当 MediaPlayer 不使用的时候,需要进行释放,避免内存泄漏,之后 mediaPlayer 的方法都不会在起作用了。一般在 onDestroy 方法中释放。

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.release();
        }
    }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值