带声音的图像按钮不起作用

时间:2016-09-03 16:12:39

标签: android android-studio android-mediaplayer imagebutton

我在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();
        }
    });


}

}

1 个答案:

答案 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方法释放资源。