• Android 使用 MediaPlayer 播放声音


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

    1.创建MediaPlayer

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

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

    需要播放声音时:

    mediaPlayer.start();
    
    • 1

    当需要重复播放声音时:

    //设置循环播放
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
       public void onCompletion(MediaPlayer mp) {
              mediaPlayer.start();
       }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    需要暂停播放声音时:

    mediaPlayer.pause();
    
    • 1

    需要停止播放声音时:

     mediaPlayer.stop();
    
    • 1

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

    try {
       mediaPlayer.prepare();
       } catch (IOException e) {
        e.printStackTrace();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    mediaPlayer.isPlaying()
    
    • 1

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

    private boolean isPlayingRing = false;
    
    • 1

    在需要使用的时候:

    if (isPlayingRing || mediaPlayer.isPlaying()) {
       mediaPlayer.stop();
       isPlayingRing = false;
       try {
           mediaPlayer.prepare();
           } catch (IOException e) {
               e.printStackTrace();
           }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    Error (-38, 0)
    stop called in state 0
    
    • 1
    • 2

    解决方式:

     mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
         @Override
         public boolean onError(MediaPlayer mp, int what, int extra) {
                mediaPlayer.reset();
                return true;
                }
     });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (mediaPlayer != null) {
                mediaPlayer.release();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    达梦数据库报错:Invalid column name [PASSWORD]
    【云原生持续交付和自动化测试】5.3 持续交付和DevOps实践基础知识
    数据仓库概念完整使用 (第一章)
    [经验] wps怎么设置行间距离28磅 #学习方法#知识分享#媒体
    公司金融期末考试题
    Linux设备驱动模型之字符设备
    Python脚本之并发执行加密方法【一】
    Word第一课
    Unity技术手册-脚本初始(上)
    实战文档:彻底搞懂JVM+Linux+MySQL+Netty+Tomcat+并发编程
  • 原文地址:https://blog.csdn.net/qq_43358469/article/details/127428536