gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:05:10 26 4
gpt4 key购买 nike

我正在通过 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 时在 Android 6 中发生(其他流工作正常)。

有什么帮助吗?

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

最佳答案

这听起来像是一个均衡问题(也许这个音频流带有一个已经被系统均衡器处理过的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) 尝试使用以下逻辑欺骗初始的“低音量”期:

  • before play, set volume to 0
  • play
  • after 2 seconds of playback, seek to position 0 (this may consume the silent period)
  • set the volume to max
  • play again

通过这种方式,您可以进行正常播放,初始延迟几秒钟。


让我们知道您的进展,我会根据更多信息和建议相应地更新此答案。

关于android - 通过 STREAM_ALARM 播放声音不会在 Marshmallow 中从头开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33011704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com