【问题标题】:Getting a ringtone to only loop once in mediaPlayer让铃声在 mediaPlayer 中只循环一次
【发布时间】:2013-05-10 17:28:43
【问题描述】:

所以基本上我使用 Spinner 小部件并将 RingtoneManager Picker 操作传递给它,然后用户选择他们的铃声。然后我调用 onActivityResult() 并获取铃声的 uri。 最后,我将 uri 传递给另一个活动,在该活动中我设置了一个警报,以便在特定时间后响起。

问题 >>> 当我在第二个活动中获得铃声的 uri 并让 mediaPlayer 播放它时,它......它不会停止。无论我尝试什么。

这是第二个活动和永不停止的媒体播放器。

                    Uri ringtone;
                    ringtone = Uri.parse(musixType);
                    //mMediaPlayer.setDataSource(DisplayNotification.this, ringtone);
                    mMediaPlayer = MediaPlayer.create(DisplayNotification.this, ringtone);
                    mMediaPlayer.start();
                    mMediaPlayer.setVolume(100, 100);
            }
            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {

                    while (mMediaPlayer != null) {
                        mMediaPlayer.stop();
                        mMediaPlayer.release();
                        mMediaPlayer = null;
                    }
                }
            });

如何让它停止@.@

编辑: 它不会停止播放的原因可能是它是来自 RingtoneManager 的铃声吗?我不知道为什么这很重要,但我现在正抓着稻草。

编辑: 有没有办法指定 mediaPlayer 运行的特定时间长度并忽略传递给它的数据?

【问题讨论】:

  • 尝试在mMediaPlayer参考上打印isLooping()的值,看看你得到了什么。
  • 问题是,它永远不会到达 onCompletionListener() 方法。我不确定,因为它是一个铃声,如果它只是一遍又一遍地重复,但我向 mediaPlayer 发送了一个 uri,所以这不重要..

标签: android android-mediaplayer


【解决方案1】:

你用MediaPlayer.setLooping方法了吗

使用mMediaPlayer.setLooping(false);

【讨论】:

  • yyuuppp。哈哈。我被难住了。
【解决方案2】:

由于您没有在 mMediaPlayer 引用的对象上调用 setLooping(true);,因此循环不应该是这里的问题,因为默认设置为 false。确保您实际上没有从外部多次调用这段代码。在mMediaPlayer = MediaPlayer.create(DisplayNotification.this, ringtone); 之前添加Log 行,看看它被记录了多少次。

【讨论】:

  • 我一开始也是这么想的。但是当我从 RingtoneManager 的铃声列表中选择铃声时,它们也会显示相同的循环行为。所以现在我知道我传递的实际铃声是本能地循环播放。我不知道如何更改它,因为它是 android 中 AudioStore 的一部分 :( 我用更具体的问题更新了我的问题
  • 我想我可以创建一个 alarmManager 的实例并设置一个警报,在 5 秒后关闭 mediaPlayer。看起来很可笑,但是哈哈。我想我可能会这样做。感谢您的回复,它对我帮助最大
  • 您还可以在 XML 中使用不可见的 Chronometer<Chronometer android:id="@+id/chrono" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" />,然后根据 onChronometerTick 事件使用它来计算和启用/禁用事物。
【解决方案3】:

使用这个

mMediaPlayer.setLooping(true);

【讨论】:

    【解决方案4】:

    我也遇到了这个问题,这样解决的:

    player.setDataSource(this, ringtone);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    player.prepareAsync();
     player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(final MediaPlayer mp) {
            myHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mp.stop();
                    mp.release();
                }
            }, mp.getDuration()); <-- Make a postDelayed runnable that has the duration of the file as its cut off. Once the song plays, it will stop the mediaPlayer.
            mp.start();
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多