【问题标题】:Android - MediaPlayer stops playingAndroid - MediaPlayer 停止播放
【发布时间】:2015-11-10 15:07:48
【问题描述】:

我正在创建一个应用程序,您可以在其中摇动设备并播放声音。我一切正常,但是当我长时间摇动设备(5 秒)时,声音停止播放。这是我的代码:

MediaPlayer mp = null;
private void executeShakeAction() {
    Random random = new Random();
    int nextInt = random.nextInt(3);
    if(nextInt == 0) {
        mp = MediaPlayer.create(this, R.raw.cowbell);
    }else if(nextInt == 1){
        mp = MediaPlayer.create(this, R.raw.cowbell1);
    }else{
        mp = MediaPlayer.create(this, R.raw.cowbell3);
    }
    mp.start();
}

【问题讨论】:

    标签: android media-player android-mediaplayer


    【解决方案1】:

    如果您过于频繁地摇晃设备,音频文件将没有时间完成。这让 Android 的生活变得如此艰难,以至于它最终放弃并停止播放。

    建议:

    • 避免创建 MediaPlayer 的实例,如果它正在播放,例如

      如果 (mp != null && mp.isPlaying()) 返回;

    • 使用 SoundPool 代替 MediaPlayer,MediaPlayer 专门用于播放短声音(代替音乐或视频,如 MediaPlayer)。

    • 如果您坚持使用 MediaPlayer,请创建一次,而不是一直重新创建。这段代码离完美还很远,但希望能完成这项工作:

    private final MediaPlayer mp = new MediaPlayer();
    private final Random random = new Random();
    private static final int[] SoundResIds = {R.raw.cowbell, R.raw.cowbell1, R.raw.cowbell2};
    private synchronized void executeShakeAction() {
        if (!mp.isPlaying()) 
           try {
              mp.reset();  // Clears mp state  
              int soundResId = SoundResIds[random.nextInt(SoundResIds.length)];
              AssetFileDescriptor afd = getResources().openRawResourceFd(soundResId);
              mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
              afd.close();
              mp.prepare();
              mp.start();
           } catch (Exception ex) {
              ex.printStackTrace();
           }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      相关资源
      最近更新 更多