媒体播放器在多次点击后停止工作/崩溃

Media Player stop working /crushes after multiple clicks

我正在创建一个包含按钮的 Android 应用程序,单击每个按钮可播放 mp3 文件。

问题是:

代码:

package com.example.puddly;

import android.animation.ObjectAnimator;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.BounceInterpolator;
import android.widget.Button;

public class GameActivity extends Activity implements OnClickListener {
    Button btnDonkey,btnHorse,btnDog,btnFrog,btnChicken,btnCow,btnPig,btnDuck,btnCat;
    MediaPlayer mp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

    btnCat=(Button)findViewById(R.id.btnCat);
    btnDonkey=(Button) findViewById(R.id.btnMonkey);
    btnHorse=(Button) findViewById(R.id.btnElephent);
    btnDog=(Button) findViewById(R.id.btnDog);
    btnFrog=(Button) findViewById(R.id.btnFrog);
    btnChicken=(Button) findViewById(R.id.btnChicken);
    btnCow=(Button) findViewById(R.id.btnCow);
    btnPig=(Button) findViewById(R.id.btnPig);
    btnDuck=(Button)findViewById(R.id.btnLion);
    btnHorse.setOnClickListener(this);
    btnDog.setOnClickListener(this);
    btnFrog.setOnClickListener(this);
    btnChicken.setOnClickListener(this);
    btnCow.setOnClickListener(this);
    btnPig.setOnClickListener(this);
    btnDuck.setOnClickListener(this);
    btnDonkey.setOnClickListener(this);
    btnCat.setOnClickListener(this);
}



    @Override
    public void onClick(View v) {

        switch (v.getId()) {
        case R.id.btnCat:
            ObjectAnimator animY = ObjectAnimator.ofFloat(btnCat, "translationY", -100f, 0f);
            animY.setDuration(1000);//1sec
            animY.setInterpolator(new BounceInterpolator());
            animY.setRepeatCount(0);
            animY.start();
            mp=MediaPlayer.create(this,R.raw.catname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);


            break;
        case R.id.btnMonkey:
               Animation animRotate = AnimationUtils.loadAnimation(this,
                        R.anim.anim_rotate);
              v.startAnimation(animRotate);
            mp=MediaPlayer.create(this,R.raw.monkeyname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);


            break;
        case R.id.btnElephent:
               Animation animTranslate = AnimationUtils.loadAnimation(this,
                        R.anim.anim_translate);
            v.startAnimation(animTranslate);
            mp=MediaPlayer.create(this,R.raw.elephantname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);

            break;
        case R.id.btnDog:
               Animation animAlpha = AnimationUtils.loadAnimation(this,
                        R.anim.anim_alpha);
            v.startAnimation(animAlpha);
            mp=MediaPlayer.create(this,R.raw.dogname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);

            break;
        case R.id.btnFrog:
               Animation animScale = AnimationUtils.loadAnimation(this,
                        R.anim.anim_scale);
            v.startAnimation(animScale);
            mp=MediaPlayer.create(this,R.raw.frogname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);

            break;
        case R.id.btnCow:
               Animation animScale2 = AnimationUtils.loadAnimation(this,
                        R.anim.anim_scale);
            v.startAnimation(animScale2);

            mp=MediaPlayer.create(this,R.raw.cowname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);

            break;
        case R.id.btnChicken:
               Animation animScale3 = AnimationUtils.loadAnimation(this,
                        R.anim.anim_scale);
            v.startAnimation(animScale3);

            mp=MediaPlayer.create(this,R.raw.chickenname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);

            break;
        case R.id.btnPig:
               Animation animScale4 = AnimationUtils.loadAnimation(this,
                        R.anim.anim_scale);
            v.startAnimation(animScale4);

            mp=MediaPlayer.create(this,R.raw.pigname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);

            break;
        case R.id.btnLion:
               Animation animScale5 = AnimationUtils.loadAnimation(this,
                        R.anim.anim_scale);
            v.startAnimation(animScale5);

            mp=MediaPlayer.create(this,R.raw.lionname);
            mp.start();
            mp.setVolume(0.5F, 0.5F);

            break;
}
    }
    }

在我看来,您的设计方法很糟糕。您不应该在每次要播放新曲目时都创建一个新的 MediaPlayer 实例。相反,使用 new 运算符在 onCreate() 中创建一个 MediaPlayer。然后,当用户点击一个按钮时,首先是 reset() 播放,然后是 setDataSource(),然后是 prepare(),最后是 start() 播放。应该工作

case R.id.btnMonkey: Animation animRotate = AnimationUtils.loadAnimation(this, R.anim.anim_rotate); v.startAnimation(animRotate); mp.reset(); mp.setDataSource("Your mp3 file source here"); mp.prepare(); mp.start(); mp.setVolume(0.5F, 0.5F);

在你的onCreate()中初始化mp变量mp = new MediaPlayer()

这对你有帮助,因为你说的声音是 2 到 3 秒。那么在这种情况下可以考虑使用 Soundpool。 here 您可以阅读更多相关信息。

并且 this 示例会对您有所帮助。