是什么原因导致setVolume在Google Pixel上工作,而不是Galaxy S9?



我目前正在尝试使用 setVolume 函数通过左、右或两个通道输出 MediaPlayer 音频。在测试期间,该功能在运行9.0 Pie的Google Pixel 2 XL上按预期工作。在我的第二台设备(运行8.0 Oreo的三星Galaxy S9)上进行测试时,音频在两个通道上播放,似乎不受setVolume调用的影响。

我在控制台中没有任何错误,因此我不太确定从哪里开始故障排除。如上所述,该应用程序经过测试并在带 2 Pie 的 Pixel 2 XL 上工作,但在带 8.0 奥利奥的 Galaxy S9 上不起作用。

private void audioTestFunction() {
if (audioSwitch.isChecked()) {
coolChangeEffect("Stop Audio Test", audioSwitch);
mp = MediaPlayer.create(getApplicationContext(), R.raw.audio_test);
mp.setLooping(true);
mp.start();
switch (channels.getCheckedRadioButtonId()){
case R.id.left_channel_button:
mp.setVolume(1.0f, 0.0f);
break;
case R.id.both_channels_button:
mp.setVolume(1.0f, 1.0f);
break;
case R.id.right_channel_button:
mp.setVolume(0.0f, 1.0f);
break;
default:
mp.setVolume(1.0f, 1.0f);
break;
}
} else {
coolChangeEffect("Audio Test", audioSwitch);
mp.stop();
}
}

在 Pixel 2 XL 上执行时,应用程序会根据所选的单选按钮设置每个通道的音量。在Galaxy S9上执行时,无论选择哪个单选按钮,应用程序都会继续在两个通道上播放,而不会改变音量。

在调用mp.start()几毫秒后,媒体播放器可能仍处于空闲状态。在Andoid文档中,它说如果从空闲状态中调用setVolume,则不会抛出任何错误,但是不会遇到对MediaPlayer状态的更改。

如果这是问题所在,则潜在的解决方法是等到mp.isPlaying()返回 true,然后再输入 switch 语句。三星的音频驱动程序可能延迟很小,这导致了此问题。

安卓文档引用:

在调用 reset() 后,新构造的 MediaPlayer 对象和 MediaPlayer 对象之间存在细微但重要的区别。调用诸如setVolume(float,float)之类的方法是一个编程错误...两种情况都处于空闲状态。

如果在构造 MediaPlayer 对象后立即调用这些方法中的任何一个,则内部播放器引擎将不会调用用户提供的回调方法 OnErrorListener.onError(),并且对象状态保持不变;但如果在 reset() 之后立即调用这些方法,则用户提供的回调方法 OnErrorListener.onError() 将由内部播放器引擎调用,并且对象将传输到 Error 状态。

问题已解决!

原始代码是正确的,Galaxy S9需要更新到Android 9.0 Pie才能使setVolume()功能正常工作。

按照@Dylan的提示,我相信这只是三星的一个错误,因为系统更新是解决方案这一事实加强了。

最新更新