user1156041
user1156041

Reputation: 2195

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;
            }
        });

Upvotes: 3

Views: 1560

Answers (3)

sergem
sergem

Reputation: 53

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()
    }

Upvotes: 1

user1156041
user1156041

Reputation: 2195

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

Upvotes: 1

Sohail Zahid
Sohail Zahid

Reputation: 8149

Use prepareAsync() with setOnPreparedListener() and when media is ready then play it.

 try {
            MediaPlayer mp = new MediaPlayer();
            AssetFileDescriptor afd = getAssets().openFd("oxygen.ogg");
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mp.setLooping(false);
            mp.prepareAsync();
            mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    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 (Exception e) {
        }

Upvotes: 0

Related Questions