[android mediaplayer在ICS上永远循环

问题描述 投票:7回答:3

我想播放通知声音,但我的问题是声音会永远循环播放,只应播放一次。

我尝试了两种方法:

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:

我尝试了两种设备,然后:

  • [在具有ICS 4.0.4的Galaxy Nexus上永远循环
  • 在HTC Hero 2.2.1上可以正常使用
android loops notifications media-player
3个回答
6
投票

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

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


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

0
投票

此问题的另一个解决方法

boolean soundPlayedOnce = true;

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

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

© www.soinside.com 2019 - 2024. All rights reserved.