我想播放通知声音,但我的问题是声音会永远循环播放,只应播放一次。
我尝试了两种方法:
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();
}
});
在第二种情况下,我从没看到踪迹“结束,我们应该释放”,音频一遍又一遍地播放。
任何想法?
非常感谢
UPDATE:
我尝试了两种设备,然后:
有些声音带有“内置”循环,将永远播放。这与将MediaPlayer设置为循环不同。如果您开始播放带有内置循环的声音,它将永远不会结束。这些大多是铃声(与警报音或通知音相反)。您可以使用myringtonemanager.setType(RingtoneManager.TYPE_ALARM|RingtoneManager.TYPE_NOTIFICATION)
将RingtoneManager设置为仅返回通知音或警报音。它将排除大多数循环声音,但是很遗憾,不能保证在任何设备上都将它们全部排除。 :-(
因此,Tiago Almeida的解决方案是一个不错的解决方法(我已经投票赞成),尽管它也会截断只有几个(没有无限循环)的所有声音。
尝试一下:
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();
}
此问题的另一个解决方法
boolean soundPlayedOnce = true;
if(soundPlayedOnce){
mp.start();
soundPlayedOnce = false;
}
在要播放声音之前将此布尔值设置为true