媒体播放器总是循环播放而不停止。

3

当在EditText上触发Enter键事件时,我尝试播放一次音频。

但是Media Player会循环播放该音频,并且永远不会停止。而且Media Player没有调用setOnCompletionListener方法。

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;
            }
        });
3个回答

1

我使用setOnSeekCompleteListener方法代替setOnCompletionListener。现在它只播放一次并完全停止。


1
我发现了一个类似的问题。 当我从资源创建MediaPlayer时,设置mediaPlayer.isLooping = false(kotlin)才有效:
MediaPlayer.create(context, R.raw.music).

当我使用URI时,它没有任何效果。

MediaPlayer.create(context, Uri.parse(myUri))

可以使用 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()
    }

对我来说,使用 new MediaPlayer() 而不是 MediaPlayer.create(context, Uri.parse(myUri)) 解决了我的问题。 - Sascha N.

0
使用prepareAsync()setOnPreparedListener(),当媒体准备好后再播放它。
 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) {
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接