我在android studio中制作了一个程序,它有10个图像按钮,每个图像按钮在点击时都会发出声音。但是,当我在模拟器上运行它们时,只有前7个图像按钮会产生声音(不关心我点击按钮的顺序)。我是新手,帮助我,这是我的代码:
public class playtimang extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_playtimang);
final MediaPlayer satukecik = MediaPlayer.create(this, R.raw.one_kecik);
final MediaPlayer satubesar = MediaPlayer.create(this, R.raw.one_besar);
final MediaPlayer duakecik = MediaPlayer.create(this, R.raw.two_kecik);
final MediaPlayer duabesar = MediaPlayer.create(this, R.raw.two_besar);
final MediaPlayer tigakecik = MediaPlayer.create(this, R.raw.three_kecik);
final MediaPlayer tigabesar = MediaPlayer.create(this, R.raw.three_besar);
final MediaPlayer limakecik = MediaPlayer.create(this, R.raw.five_kecik);
final MediaPlayer limabesar = MediaPlayer.create(this, R.raw.five_besar);
final MediaPlayer enamkecik = MediaPlayer.create(this, R.raw.six_kecik);
final MediaPlayer enambesar = MediaPlayer.create(this, R.raw.six_besar);
ImageButton satu_kecikIB = (ImageButton) this.findViewById(R.id.satukecikIB);
ImageButton satu_besarIB = (ImageButton) this.findViewById(R.id.satubesarIB);
ImageButton dua_kecikIB = (ImageButton) this.findViewById(R.id.duakecikIB);
ImageButton dua_besarIB = (ImageButton) this.findViewById(R.id.duabesarIB);
ImageButton tiga_kecikIB = (ImageButton) this.findViewById(R.id.tigakecikIB);
ImageButton tiga_besarIB = (ImageButton) this.findViewById(R.id.tigabesarIB);
ImageButton lima_kecikIB = (ImageButton) this.findViewById(R.id.limakecikIB);
ImageButton lima_besarIB = (ImageButton) this.findViewById(R.id.limabesarIB);
ImageButton enam_kecikIB = (ImageButton) this.findViewById(R.id.enamkecikIB);
ImageButton enam_besarIB = (ImageButton) this.findViewById(R.id.enambesarIB);
satu_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
satukecik.start();
}
});
satu_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
satubesar.start();
}
});
dua_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
duakecik.start();
}
});
dua_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
duabesar.start();
}
});
tiga_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tigakecik.start();
}
});
tiga_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tigabesar.start();
}
});
lima_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
limakecik.start();
}
});
lima_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
limabesar.start();
}
});
enam_kecikIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
enamkecik.start();
}
});
enam_besarIB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
enambesar.start();
}
});
}
}
答案 0 :(得分:1)
由于MediaPlayer
适用于包含各种格式视频的长时间运行或大型媒体文件,因此将音频用于某些小音调是很糟糕的,因为它本身包含大量计算。我需要architecture diagram才能使用MediaPlayer
,而应使用SoundPool
,因为它仅用于此类目的。
现在问题的主要答案是
正如官方文件中所述
"创建"在API级别1中添加
MediaPlayer create(Context context,int resid)
为给定资源ID创建MediaPlayer的便捷方法。成功时,prepare()已经被调用,不能再被调用。当使用MediaPlayer时,你应该调用release()来释放资源。如果未释放,过多的MediaPlayer实例将导致异常。请注意,由于在此方法中自动调用prepare(),因此无法更改音频流类型(请参阅setAudioStreamType(int)),音频会话ID(请参阅setAudioSessionId(int))或音频属性(请参阅新的setAudioAttributes(AudioAttributes))的MediaPlayer。
简而言之,您必须遵循MediaPlayer
的状态图来确保此类错误或异常的安全性。每次调用后都必须调用release方法释放资源。