我创建了一个简单的应用程序,屏幕上几乎没有按钮。其中一个按钮叫做soundButton,当用户按下它时,将播放一个音频文件。 (例如,简单的单词,如" apple")。我有大约100个类似的屏幕,当我最初几次播放声音时,我可以听到声音,过了一会儿,无论我去哪个屏幕,我都无法再听到它们(甚至是前一个屏幕可以听到不再播放声音)这是我的编码,供参考:
package com.example.main;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
public class EngApple extends Activity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eng_apple);
ImageButton soundButton = (ImageButton) findViewById(R.id.sound);
final MediaPlayer mp1 = MediaPlayer.create(this, R.drawable.apple);
soundButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mp1.start();
}
});
}
}
这是一个闪存卡应用,声音非常短。我读到需要用来播放短音的方法是使用soundPool。所以我改变了我的代码但是徒劳无功。 (听起来没玩)任何人都可以帮我吗?谢谢
答案 0 :(得分:1)
如果您确实按照上述模式进行了100多项活动,则表示每次启动新的“活动”屏幕时,您都会使用声音已加载来实例化MediaPlayer实例。我怀疑有些东西只是通过同时拥有那么多的MediaPlayer实例而得出的。鉴于您的声音全部都在资源中,您可以将.create
电话推迟到.start()
来电之前。
考虑使用一个单独的类来管理MediaPlayer的一个实例。如下所示:
import android.content.Context;
import android.media.MediaPlayer;
public class MediaPlayerWrapper
{
static MediaPlayer _player;
public static void play(Context context, int id)
{
stop();
_player = MediaPlayer.create(context, id);
_player.start();
}
public static void stop()
{
if (_player != null)
{
_player.reset();
_player.release();
_player = null;
}
}
}
然后你的onCreate方法就变成了:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eng_apple);
soundButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MediaPlayerWrapper.play(EngApple.this, R.drawable.apple);
}
});