I tried to play audio once when Enter key event occur on EditText.
But the Media player plays looping the audio and never stop. And Media Player didn't call setOnCompletionListener method.
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
//Toast.makeText(LoginActivity.this, editText.getText(), Toast.LENGTH_SHORT).show();
try {
MediaPlayer mp = new MediaPlayer();
AssetFileDescriptor afd = getAssets().openFd("oxygen.ogg");
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
mp.setLooping(false);
mp.prepare();
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.i("ONComplete Media palyer", "onComplete hit");
mp.stop();
mp.release();
}
});
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
return false;
}
});
I use setOnSeekCompleteListener method instead of setOnCompletionListener. It plays once and complete stop now.
I stumbled upon a similar issue.
Setting mediaPlayer.isLooping = false (kotlin) worked only when I created MediaPlayer from a resource:
MediaPlayer.create(context, R.raw.music).
It had no effect when I used URI
MediaPlayer.create(context, Uri.parse(myUri))
A possible workaround can be built with CountDownTimer
setAlarmStopperTimer(musicPlayer, delay = musicPlayer.duration.toLong())
.....
private fun setAlarmStopperTimer(mediaPlayer: MediaPlayer, delay: Long) {
alarmStopperTimer = object : CountDownTimer(delay, 100) {
@RequiresApi(Build.VERSION_CODES.O)
override fun onFinish() {
mediaPlayer.stop()
}
override fun onTick(millisUntilFinished: Long) {
}
}
alarmStopperTimer.start()
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With