как остановить медиаплеер - PullRequest
1 голос
/ 21 марта 2020

У меня 3 тона. Я вызываю функцию playmusi c (), чтобы воспроизвести 2 из этих тонов при переключении вида изображения. когда я нажимаю на изображение в первый раз, тон1 начинает играть. когда я нажимаю 2-й раз на том же изображении, начинает воспроизводиться тональный сигнал 2, но тональный сигнал 1 не останавливается.

Мой требование - когда я нажимаю на изображение для - (1-й раз - тон1 должен начать играть). (2-й раз - тон1 должен прекратить воспроизведение, и тон2 должен начать воспроизведение) (3-й раз - тон2 должен прекратить воспроизведение, и тон1 должен начать воспроизведение снова) и т. Д.

 String file=null;
 int x=0;
    public void playMusic(int i) {
        x=i;
        if(i==1){
            file = R.raw.tone1;
        }else if(i==2){
            file = R.raw.tone2;
        }else{
            file = R.raw.tone3;
        }
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        AssetFileDescriptor assetFileDescriptor = 
        Main2Activity.this.getResources().openRawResourceFd(file);
        if(assetFileDescriptor == null) return;
        try {
            mediaPlayer.setDataSource(
                    assetFileDescriptor.getFileDescriptor(),
                    assetFileDescriptor.getStartOffset(),
                    assetFileDescriptor.getLength()
            );
            assetFileDescriptor.close();

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    if(mediaPlayer != null){
                        mediaPlayer.release();
                        mediaPlayer = null;
                    }
                }
            });

            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(final MediaPlayer mediaPlayer) {
                    mediaPlayer.start();
                }
            });
            mediaPlayer.prepareAsync();

        } catch (IllegalArgumentException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        } catch (IllegalStateException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        } catch (IOException e) {
//                            HelpFunctions.showLog("ERROR = " + e);
        }
    }

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Я сделал небольшую модификацию в вашей логике c и добавил mediaplayer.reset (). Вот решение ссылка

public class MainActivity extends AppCompatActivity {

   @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final ImageView player = findViewById(R.id.play);
      player.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
             playMusic(1);
         }
       });

      mediaPlayer = new MediaPlayer();
    }

    int file = 0;
    MediaPlayer mediaPlayer;

    int x = 0;

    public void playMusic(int i) {
     x = x + i;
     if (x == 1) {
     file = R.raw.tone1;
   } 
    else if (x == 2) {
    file = R.raw.tone2;
   } else {
    x = 0;
    file = R.raw.tone3;
    }
mediaPlayer.reset();

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor assetFileDescriptor =
    MainActivity.this.getResources().openRawResourceFd(file);
if (assetFileDescriptor == null) return;
try {
  mediaPlayer.setDataSource(
      assetFileDescriptor.getFileDescriptor(),
      assetFileDescriptor.getStartOffset(),
      assetFileDescriptor.getLength()
  );
  assetFileDescriptor.close();

  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
      if (mediaPlayer != null) {
        mediaPlayer.release();
      }
    }
  });

  mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener()      {
    @Override
    public void onPrepared(final MediaPlayer mediaPlayer) {
      mediaPlayer.start();
    }
  });
  mediaPlayer.prepareAsync();
    } catch (IllegalArgumentException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
   } catch (IllegalStateException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
} catch (IOException e) {
  //                            HelpFunctions.showLog("ERROR = " + e);
    }
  }
}
0 голосов
/ 21 марта 2020

когда я нажимаю 2-й раз на том же изображении, начинает воспроизводиться тональный просмотр тона 2, но тональный сигнал 1 не останавливается.

Если это единственная проблема, попробуйте поставить следующую строку перед вызовом mediaPlayer = new MediaPlayer();:

if (mediaPlayer != null && mediaPlayer.isPlaying()) mediaPlayer.stop();

...