Ошибка при воспроизведении звука после завершения игры в студиях Android

#java #android-studio #android-mediaplayer #tic-tac-toe

Вопрос:

Я попытался написать код для игры в Тиктакто (тема мстителей)…когда игра будет закончена, будет воспроизведен соответствующий звук (3 разных звука в .mp3 формате и размере файлов < 100 Кб вместе взятых, а продолжительность составляет..Я пытался сделать это с помощью медиаплеера, и он работает только до 2 ходов, когда мы играем в игру непрерывно…и после этого он не воспроизводит соответствующий звук после окончания игры, и даже после того, как я продолжу играть после нескольких ходов, он воспроизводит все три звука одновременно, и приложение вылетает.

ПРИМЕЧАНИЕ: игра работает совершенно нормально, проблема только в звуке.

Инициализация: private MediaPlayer ironman, captain, draw;

Вызов mp3-файлов в public void click(View view) качестве ironman = MediaPlayer.create(this, R.raw.i_am); captain = MediaPlayer.create(this, R.raw.do_this); draw = MediaPlayer.create(this, R.raw.giveup);

Я использовал .start() в условиях выигрыша для воспроизведения звука и .pause() остановки звука в public void playAgain (View view)

MainActivity.java полный код:

 public class MainActivity<string> extends AppCompatActivity {

//to track the boxes (if value is 2 it is taken as empty box)
int[] position = {2, 2, 2, 2, 2, 2, 2, 2, 2};

//used to decide who's turn to play
int active;

//helps to stop the after a player is the winner
boolean activeGame = true;

//to display the winner text
String winner = "";

private MediaPlayer ironman, captain, draw;


public void click(View view) {

    ironman = MediaPlayer.create(this, R.raw.i_am);
    captain = MediaPlayer.create(this, R.raw.do_this);
    draw = MediaPlayer.create(this, R.raw.giveup);

    ImageView iv = (ImageView) view;
    TextView turn = (TextView) findViewById(R.id.turn);

    int tagPosition = Integer.parseInt(iv.getTag().toString());

  //checks valid move or not and whether game is active or not
  if(position[tagPosition] == 2 amp;amp; activeGame) {

      //animation
      iv.animate().alpha(1).setDuration(300);

      // 0 : captain america, 1 : ironman , 2 : empty
      //also flips the active value (change the current player)
      if (active == 0) {
          iv.setImageResource(R.drawable.captainamerica);
          position[tagPosition] = active;
          active =1;
          turn.setText("Ironman's turn.");
      }else {
          iv.setImageResource(R.drawable.ironman);
          position[tagPosition] = active;
          active =0;
          turn.setText("Captain america's turn.");
      }

      //checking whether game is over or not
      //win condition for Captain america
      if((position[0]==0 amp;amp; position[1]==0 amp;amp; position[2]==0) || (position[3]==0 amp;amp; position[4]==0 amp;amp; position[5]==0) || (position[6]==0 amp;amp; position[7]==0 amp;amp; position[8]==0) ||
              (position[0]==0 amp;amp; position[3]==0 amp;amp; position[6]==0) || (position[1]==0 amp;amp; position[4]==0 amp;amp; position[7]==0) || (position[2]==0 amp;amp; position[5]==0 amp;amp; position[8]==0) ||
              (position[0]==0 amp;amp; position[4]==0 amp;amp; position[8]==0) || (position[2]==0 amp;amp; position[4]==0 amp;amp; position[6]==0)){

          captain.start();
          turn.setVisibility(View.INVISIBLE);
          activeGame = false;
          winner = "Captain america won the game!!";
          gameFinish(winner);

      }
      //win condition for Ironman
      else if((position[0]==1 amp;amp; position[1]==1 amp;amp; position[2]==1) || (position[3]==1 amp;amp; position[4]==1 amp;amp; position[5]==1) || (position[6]==1 amp;amp; position[7]==1 amp;amp; position[8]==1) ||
              (position[0]==1 amp;amp; position[3]==1 amp;amp; position[6]==1) || (position[1]==1 amp;amp; position[4]==1 amp;amp; position[7]==1) || (position[2]==1 amp;amp; position[5]==1 amp;amp; position[8]==1) ||
              (position[0]==1 amp;amp; position[4]==1 amp;amp; position[8]==1) || (position[2]==1 amp;amp; position[4]==1 amp;amp; position[6]==1)){

          ironman.start();
          turn.setVisibility(View.INVISIBLE);
          activeGame = false;
          winner = "Ironman won the game!!";
          gameFinish(winner);

      }
      //condition for draw match
      else if(isTied() ){

          draw.start();
          turn.setVisibility(View.INVISIBLE);
          winner = "Game is Draw, try again!!";
          gameFinish(winner);

      }
  }
}



//logic for playAgain button
public void playAgain (View view) {
   TextView tvResult = (TextView) findViewById(R.id.tvResult);

   Button btnPlayAgain = (Button) findViewById(R.id.btnPlayAgain);

   TextView name = (TextView) findViewById(R.id.name);

   TextView turn = (TextView) findViewById(R.id.turn);

   tvResult.setVisibility(View.INVISIBLE);
   btnPlayAgain.setVisibility(View.INVISIBLE);
   name.setVisibility(View.INVISIBLE);
   turn.setVisibility(View.VISIBLE);

   turn.setText("Select a grid to start the game.nIt's Captain america's turn.");

   GridLayout gridLayout = (GridLayout) findViewById(R.id.gridLayout);

   draw.pause();ironman.pause();captain.pause();

   for (int i = 0; i < gridLayout.getChildCount(); i  ) {

       ImageView imageView = (ImageView) gridLayout.getChildAt(i);
       imageView.animate().alpha(0).setDuration(300);
       imageView.setImageDrawable(null);
   }

   for (int i = 0; i < position.length; i  ) {
       position[i] = 2;
   }
   active = 0;
   activeGame = true;
}


//to print the winner and for displaying the text and playAgain btn
public void gameFinish(String winner){

   TextView tvResult = (TextView) findViewById(R.id.tvResult);

   Button btnPlayAgain = (Button) findViewById(R.id.btnPlayAgain);

   TextView name = (TextView) findViewById(R.id.name);

   tvResult.setVisibility(View.VISIBLE);
   btnPlayAgain.setVisibility(View.VISIBLE);
   name.setVisibility(View.VISIBLE);

   tvResult.setText(winner);
}

//checks every value in position if there is 2 it indicates there are empty boxes
public boolean isTied(){
    
    for(int i=0; i<position.length; i  ){
        if(position[i]==2){
            return false;
        }
    }
    return true;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

 }
}
 

Ответ №1:

Вот моя функция воспроизведения звука.

 //Your code..
private MediaPlayer soundPlayer;
private static final String TAG = "MUSIC ERROR";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    soundPlayer = MediaPlayer.create(this.context, R.raw.giveup);
}
//Your code 


   
private void playSound(String soundID) {
    try {
            if (soundPlayer != null amp;amp; soundPlayer.isPlaying()) {
                soundPlayer.pause();
            }
            soundPlayer = MediaPlayer.create(this,
                    getResources().getIdentifier(soundID, "raw", this.getPackageName())
            );
            soundPlayer.setVolume(100, 100);
            soundPlayer.setLooping(false);
            soundPlayer.start();
            soundPlayer.setOnCompletionListener(mp -> {
                mp.release();
                soundPlayer = null;
            });

        }catch (Exception e) {
            Log.d(TAG, "playSound: SOMETHING WENT WRONG");
            soundPlayer.release();
            soundPlayer = null;
        }
}
 

Вызовите эту функцию с именем аудиофайла, в котором вы хотите воспроизвести аудиофайл. Нравится:

 playSound("do_this");