7

我想播放通知声音,我的问题是声音永远循环播放,而它应该只响一次。

我尝试了两种方法:

notification.sound = Uri.parse("content://media/internal/audio/media/38");

mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
mMediaPlayer.setDataSource(this, Uri.parse("content://media/internal/audio/media/38"));
mMediaPlayer.setLooping(false);
mMediaPlayer.prepare();
mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        Log.v(Utils.TAG, "onprepared");
        mp.start();
    }
});

mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        Log.v(Utils.TAG, "end, we should release");
        mp.stop();
        mp.release();
    }
});

在第二种情况下,我从来没有看到“结束,我们应该释放”的痕迹,音频一遍又一遍地播放。

任何想法?

非常感谢

更新:

我尝试了两种设备,并且:

  • 它在带有 ICS 4.0.4 的 Galaxy Nexus 上永远循环
  • 它在 HTC Hero 2.2.1 上运行良好
4

3 回答 3

7

有些带有“内置”循环的声音会永远播放。这与将 MediaPlayer 设置为循环播放不同。如果您开始播放带有内置循环的声音,它将永远不会结束。这些主要是铃声(与警报音或通知音相反)。您可以将 RingtoneManager 设置为仅返回通知音或警报音,myringtonemanager.setType(RingtoneManager.TYPE_ALARM|RingtoneManager.TYPE_NOTIFICATION) 它们将排除大多数循环声音,但不幸的是,这不能保证在任何设备上都排除它们。:-(

因此,Tiago Almeida 的解决方案是一个很好的解决方法(我已经投了赞成票),尽管它也会截断所有只有几个(并且没有无限)循环的声音。

于 2012-11-27T11:36:45.663 回答
5

尝试这个:

try {
    mp.setDataSource(uri.toString());
    mp.setAudioStreamType(AudioManager.STREAM_ALARM);
    mp.prepare();
    mp.start();
    mp.setOnSeekCompleteListener(new OnSeekCompleteListener() {
        public void onSeekComplete(MediaPlayer mp) {
            mp.stop();
            mp.release();
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}
于 2012-10-01T08:48:16.817 回答
0

此问题的另一种解决方法

boolean soundPlayedOnce = true;

if(soundPlayedOnce){
   mp.start();
   soundPlayedOnce = false;
}

在您想要播放声音之前将此布尔值设置为 true

于 2020-03-30T11:25:07.803 回答