在Marshmallow中通过STREAM_ALARM播放声音不从开头开始

3

我正在通过STREAM_ALARM播放声音:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(context, notificationSoundUri);
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
});
mp.prepare();

在 Android 6 上,这个功能一切正常,直到我尝试使用它。在 Android 6 上,声音不会从开头播放,所以如果我播放短暂的声音,就听不到声音。我尝试使用 seekTo(0) 和其他方式初始化 MediaPlayer。

只有在使用 STREAM_ALARM 时才会发生这种情况(其他流工作正常)。

需要帮助吗?

编辑:我意识到实际上声音是从开始播放的,但音量非常低,并且大约 2 秒后音量增加…您知道如何停用此行为吗?

1个回答

1
听起来像是一个均衡问题(也许这个音频流带有系统均衡器已经处理的audioSessionId?)
在MediaPlayer初始化之前,我会尝试以下技巧: 1)更改STREAM_ALARM音量
AudioManager mAudioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, 0 /*flags*/);

2) 在prepare()之后设置音量

//...
mp.prepare();
mp.setVolume(1.0f, 1.0f);

3)更改audioSessionId
//...
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setAudioSessionId(CUSTOM_ID); //manually assign an ID here
//...

更新

4) 尝试使用SoundPool API而不是MediaPlayer,看看问题是否仍然存在(我还怀疑这是一个与设备有关的问题)。

5) 尝试在MediaPlayer上调用start() ==> pause() ==> start()

@Override
public void onPrepared(MediaPlayer mp) {
    mp.start();
    mp.pause();
    mp.start();
}

6) 尝试用以下逻辑欺骗初始的“低音量”期:

  • 播放之前将音量设置为0
  • 播放
  • 播放2秒后,跳转到位置0(这可能会消耗静默期
  • 将音量设置为最大
  • 再次播放

通过这种方式,您可以尝试进行正常的播放,并且只需进行几秒钟的初始延迟。


请告诉我们您的进展情况,我将根据更多信息和建议更新此答案。


我尝试了你建议的:设置闹钟音量、设置媒体音量和setAudioStreamType,但是没有任何改变 :( - Sergio Viudes
@SergioViudes :( 我已经更新了我的答案并提供了更多的提示,请告诉我。 - bonnyz
嗨。谢谢,但是它不起作用。似乎只有在通过STREAM_ALARM播放声音时Nexus 6才会这样做... - Sergio Viudes
@SergioViudes 是的,但这似乎是一个设备相关的问题。这是一种典型的均衡器问题,在许多设备上都存在(不仅仅是 6.0 版本的)。 - bonnyz
我认为这是设计上的考虑,因为从低音量开始播放警报声是有意义的。但如果我们愿意的话,改变这种行为会很好。 - Sergio Viudes
显示剩余7条评论

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