Android 播放短音的正确方法?
Posted
技术标签:
【中文标题】Android 播放短音的正确方法?【英文标题】:The correct way to play short sounds Android? 【发布时间】:2012-03-11 16:48:37 【问题描述】:我正在创建一个将在屏幕上显示多个图像的应用程序,这些图像将是按钮,点击时会播放短促的声音。我对此进行了研究,只能找到我用来播放声音的当前方法,这似乎根本没有响应。我希望声音可以快速播放,并且可以响应许多快速点击。我不确定这在 android 中是否可行。
我用来播放声音的代码是这样的:
Button sound1;
MediaPlayer firstSound;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
firstSound = MediaPlayer.create(SoundActivity.this, R.raw.click);
sound1 = (Button) findViewById(R.id.Sound1);
beaver.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
firstSound.start();
);
我的延迟问题也可能与我使用媒体播放器对象的方式有关?我确实觉得这在我的手机上应该更流畅,任何关于如何在 Android 中播放声音的建议都非常感谢。
谢谢。
自从发现 Sound Pool 以来,我已经编辑了我的代码以使用它并且它运行良好,新代码如下所示:
SoundPool soundPool;
HashMap<Integer, Integer> soundPoolMap;
int soundID = 1;
Button sound1;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(soundID, soundPool.load(this, R.raw.click, 1));
sound1 = (Button) findViewById(R.id.bBeaver);
sound1.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float leftVolume = curVolume/maxVolume;
float rightVolume = curVolume/maxVolume;
int priority = 1;
int no_loop = 0;
float normal_playback_rate = 1f;
soundPool.play(soundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);
);
谢谢
【问题讨论】:
您似乎没有使用 soundPoolMap? 喜欢你的实现方式,同时运行良好 非常感谢。效果很好……! 在解决 MediaPlayer 问题几个小时后,我在五分钟内完成了 SoundPool,谢谢! @Moberg 是对的,而不是:"soundPool.play(soundID..." 它应该是:"soundPool.play(soundPoolMap.get(soundID)..." 【参考方案1】:您可以使用SoundPool
。它非常适合您想要做的事情。
您只需要一种方法来存储与每个图像(或按钮)对应的音效 ID。
也许扩展 Button 以存储关联的音效 ID。并使用一个普通的 SoundPool 播放按钮被触摸时关联到 id 的音效。
You can read more about SoundPool here.
【讨论】:
感谢您的建议和链接。我进一步研究并找到了一个教程,这帮助我做我想做的事,它肯定比媒体播放器好得多!非常感谢! 能发个教程的链接吗? @Moberg 你有一个***.com/questions/17069955/…【参考方案2】:@Rikonator 与 Soundpool 一起走在正确的轨道上。它更适合您所追求的功能。
但是,如果您决定使用媒体播放器,请不要忘记 prepareAsync () 方法以防止它挂起 UI 线程。您可以阅读有关播放媒体的更多信息here。
【讨论】:
最好在 UI 线程上阻塞,因为声音用于按钮。挂起 UI 可能很糟糕,但迟到的声音有点奇怪。【参考方案3】:MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
try
if (mp.isPlaying())
mp.stop();
mp.release();
mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
mp.start();
catch (Exception e)
e.printStackTrace();
【讨论】:
感谢分享。这对我有用:)以上是关于Android 播放短音的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章
AVAudioPlayer 在我的 iPhone 上播放短音?