【问题标题】:Play Sound File from res/raw using MediaPlayer使用 MediaPlayer 从 res/raw 播放声音文件
【发布时间】:2014-03-07 14:59:45
【问题描述】:

我想使用MediaPlayer 播放原始文件夹中的声音文件,但我不想使用MediaPlayer.create() 方法,因为我想多次播放它并想保留MediaPlayer 对象。我成功编译了以下代码,但它什么也没播放,我也听不到任何声音。

public void STARTSOUND(SOUND sound) throws IOException {
    switch(sound) {
        case SOUND_MENUBG:
            Uri uri = Uri.parse("R.raw.mainmenu");
            PLAYSOUND(uri);
            break;
    }
}

public void PLAYSOUND(Uri file) throws IOException {
    mPlayerLoopSound.setDataSource(GameManager.getInstance().getCurrentActivity(),file);
    mPlayerLoopSound.prepareAsync();
    mPlayerLoopSound.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            if (!mPlayerLoopSound.isPlaying()){
                mPlayerLoopSound.setVolume(1.0f, 1.0f);
                //start the player
                mPlayerLoopSound.start();
            }
        }
    });     
}

onPrepared() 方法永远不会被调用。 我做错什么了吗?

【问题讨论】:

  • 你将不得不使用我们的 eoncreate 方法..,就像这个 MediaPlayer mPlayer = MediaPlayer.create(FakeCallScreen.this, R.raw.mysoundfile);
  • @VinamraBhabal 你在实际设备上运行你的代码吗?
  • @Kanwaljit Singh 是的...

标签: android audio media-player


【解决方案1】:
private void playButtonSound(final Context context, final int resourceId)
    {
        final MediaPlayer mediaPlayer = MediaPlayer.create(context, resourceId);
        if (mediaPlayer != null)
        {
            mediaPlayer.setOnCompletionListener(new OnCompletionListener()
            {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer)
                {
                    if (mediaPlayer != null)
                    {
                        mediaPlayer.stop();
                        mediaPlayer.release();
                        mediaPlayer = null;
                    }
                }
            });
            mediaPlayer.start();
        }
    }

像这样调用这个方法。

playButtonSound(PopScreenActivity.this, R.raw.soundfilename);

【讨论】:

  • 我不想使用 create() 方法。因为多次使用它会使用更多的内存并且 Game Play 会出现问题。我想保留媒体播放器对象..
  • @VinamraBhabal 如果您的声音文件继续播放,则使用 mediaPlayer.setLooping(true);
  • 否则使用该服务。
  • @Zala Janaksinh 我这样做了...但没有工作...我收到错误 MediaPlayer(22853): error (1, -2147483648)....
  • 我无法解决这个问题。所以我改变了我的声音代码,我遇到了另一个问题......请帮助我。 stackoverflow.com/questions/22243303/…
【解决方案2】:

首先,希望您正在初始化您的 MediaPlayer:

mPlayerLoopSound = new MediaPlayer();

接下来,请务必致电:

mPlayerLoopSound.setAudioStreamType(AudioManager.STREAM_MUSIC);

其中:

设置此 MediaPlayer 的音频流类型。有关流类型的列表,请参阅 AudioManager。必须在 prepare() 或 prepareAsync() 之前调用此方法,以便目标流类型在之后生效。

然后,在您的 OnPreparedListener() 中,当 onPrepared() 被调用时,请注意它的参数:MediaPlayer mp。这是准备好播放的 MediaPlayer,因此您可以使用它:

@Override
public void onPrepared(MediaPlayer mp) {
    if(!mp.isPlaying()) {
        mp.setVolume(1.0f, 1.0f);
        mp.start();
    }
}

【讨论】:

  • 感谢您的回复。但这也不起作用..我收到错误 MediaPlayer(22853): error (1, -2147483648)。在调试中运行代码时,我的调试器调用没有进入 mPlayerLoopSound.setOnPreparedListener(new OnPreparedListener(){}...
  • @Melquiades 与上面给出的代码相同......除了添加 mPlayerLoopSound.setAudioStreamType(AudioManager.STREAM_MUSIC); 没有任何变化在 prepareAsync() 之前。
  • @VinamraBhabal 您问题中的代码不足以判断为什么会出现此错误,至少包括 onCreate()、onPause()、onResume()。
  • 另外,请解释您何时收到此错误。它是在应用程序的开头吗?按下按钮后?播放声音后?等等……
  • @Melquiades 现在我更新了我的代码。在这两行之后我收到错误...mPlayerLoopSound.setDataSource(GameManager.getInstance().getCurrentActivity(),file); mPlayerLoopSound.prepareAsync(); 我的主要问题是我的电话没有进入mPlayerLoopSound.setOnPreparedListener(new OnPreparedListener() 方法...为此该怎么办
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多