安卓媒体播放器在ICS上无限循环

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

在第二种情况下,我从未看到“结束,我们应该释放”的痕迹,音频一遍又一遍地播放。
有什么想法吗?
非常感谢。
更新:
我尝试了两个设备:
在Galaxy Nexus上的ICS 4.0.4上无限循环,
在HTC Hero 2.2.1上正常工作。

你在测试哪个设备? - FoamyGuy
嗨,Tim,我已经更新了我的问题。看起来在ICS上它不能正常工作。 - zegnus
Zegnus,你解决问题了吗?我确认在我的Galaxy Nexus上也遇到了相同的问题。 - Denis Masyukov
3个回答

7
有一些带有“内置”循环的声音会一直播放。这与将MediaPlayer设置为循环不同。如果您开始播放具有内置循环的声音,它将永远不会结束。这些大多是铃声(而不是闹钟铃声或通知铃声)。 您可以使用myringtonemanager.setType(RingtoneManager.TYPE_ALARM|RingtoneManager.TYPE_NOTIFICATION)将RingtoneManager设置为仅返回通知铃声或闹钟铃声,从而排除大多数循环声音, 但很遗憾这并不能保证在任何设备上都排除它们所有。 :( 因此,Tiago Almeida的解决方案是一个好的解决方法(我已经投票支持),尽管它也会缩短所有只有几个(没有无限)循环的声音。

setOnSeekCompleteListener 的解决方法对我不起作用。是否有其他解决方案或者我应该使用自己的声音来确保? - shelll

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

在我的情况下,对于具有无限循环的声音,setOnSeekCompleteListener 没有被调用,因此它们会一直循环。有什么想法是出了什么问题吗? - shelll
@shelll 你找到这个问题的解决方案了吗? - morha13
@morha13,很抱歉,不行。 - shelll

0

这个问题还有一个解决方法

boolean soundPlayedOnce = true;

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

将这个布尔值设为true,就在你想要播放声音之前。

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