Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Media player always loop and never stop

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;
            }
        });
like image 521
user1156041 Avatar asked Jan 28 '26 15:01

user1156041


2 Answers

I use setOnSeekCompleteListener method instead of setOnCompletionListener. It plays once and complete stop now.

like image 175
user1156041 Avatar answered Jan 31 '26 05:01

user1156041


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()
    }
like image 38
sergem Avatar answered Jan 31 '26 05:01

sergem



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!