【问题标题】:Playing sound through STREAM_ALARM doesn't start from beginning in Marshmallow通过 STREAM_ALARM 播放声音不会在 Marshmallow 中从头开始
【发布时间】:2015-10-20 16:23:32
【问题描述】:

我正在通过 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。 只有在 Android 6 中使用 STREAM_ALARM 时才会发生这种情况(其他流运行良好)。

有什么帮助吗?

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

【问题讨论】:

    标签: android android-mediaplayer android-alarms android-6.0-marshmallow


    【解决方案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(这可能会消耗静默期
    • 将音量设置为最大
    • 再玩一次

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


    让我们知道您的进度,我会相应地更新此答案并提供更多信息和建议。

    【讨论】:

    • 我尝试了你的建议:设置闹钟音量,设置mp音量和setAudioStreamType,但没有任何区别:(
    • @SergioViudes :( 我已经用更多提示更新了我的答案,请告诉我
    • 嗨。谢谢,但它不起作用。当通过 STREAM_ALARM 播放声音时,似乎 Nexus 6 会这样做......
    • @SergioViudes 你在其他 6.0 设备或模拟器上试过吗?
    • 没有。但是虽然它可以在模拟器上运行,但我希望它可以在我的设备上运行,以确保它可以在所有设备上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2010-11-12
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多