[在具有Android 6.0.1的阿尔卡特POP 4+中,我的SoundPool声音音量很小,而MediaPlayer声音的音量很高,只需要播放声音就不会改变音量。在其他设备和模拟器中,它可以完美运行。
我正在使用带有声音池的SFX进行播放:
soundPool.play(soundID[sound], 1, 1, 0, loop, 1);
以及音乐使用此:
mPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mPlayer.start();
}
});
您可以看到我没有指定音量,但是在具有Android 6.0.1的阿尔卡特POP 4+中,SFX(SoundPool)的音量非常低。
我尝试将MediaPlayer
的卷1指定为mPlayer.setVolume(1, 1);
,但结果相同。
如何解决?
确保MediaPlayer
和SoundPool
都在同一音频流上播放。这是通过将Android 5以下的int streamType
设置为Android 5+上的AudioAttributes
来完成的。
[streamType
将成为stream constants中的AudioManager
之一,例如STREAM_MUSIC
。
使用builder构造AudioAttributes
对象。您不再直接处理流类型。 Android会根据您在setUsage
和setContentType
中传递的内容为您的播放器分配一个流,例如
new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build()
对于Lollilop之前的
SoundPool
,使用现在不建议使用的constructor:
new SoundPool(maxStreams, streamType, 0)
对于棒棒糖使用
SoundPool
后的builder:
new SoundPool.Builder() .setMaxStreams(maxStreams) .setAudioAttributes(audioAttributes) .build()
对于棒棒糖之前调用
MediaPlayer
之前的setAudioStreamType(int streamType)
的setAudioStreamType(int streamType)
。
对于棒棒糖之后prepare
之前调用MediaPlayer
的setAudioAttributes(AudioAttributes)
。>>
通常是在setAudioAttributes(AudioAttributes)
上播放音乐,在prepare
上响起电话,在STREAM_MEDIA
上响起警报,依此类推。执行用户期望的操作。
[没有播放任何声音时,音量按钮控制STREAM_RING
。当使用STREAM_ALARM
进行操作时,音量按钮可以控制音量。至少在运行Android 8的手机上,我不确定Android 9或10的情况已经改变。