在Android O中使用新的VolumeShaper时,我试图使用MediaPlayer创建它:
// Create a VolumeShaper configuration
VolumeShaper.Configuration volumeShaperConfig =
new VolumeShaper.Configuration.Builder()
.setDuration(3000)
.setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f})
.setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
.build();
mVolumeShaper = mMediaPlayer.createVolumeShaper(configuration);
mMediaPlayer.setDataSource(context, uri);
mMediaPlayer.prepareAsync();
但是,当我尝试运行它时,它会引发异常:
Caused by: java.lang.IllegalArgumentException: invalid configuration or operation: -19
at android.media.VolumeShaper.applyPlayer(VolumeShaper.java:189)
at android.media.VolumeShaper.<init>(VolumeShaper.java:54)
at android.media.MediaPlayer.createVolumeShaper(MediaPlayer.java:1392)
答案 0 :(得分:0)
为了创建VolumeShaper
,MediaPlayer
对象必须位于&#34;已初始化&#34;在调用setDataSource
之后发生的状态。 (见:MediaPlayer state diagram。)
在这种情况下,只需更改代码即可按此顺序执行此操作:
mMediaPlayer.setDataSource(context, uri);
mMediaPlayer.prepareAsync();
mVolumeShaper = mMediaPlayer.createVolumeShaper(configuration);
在.start()
上调用MediaPlayer
之前,还可以延迟创建VolumeShaper,值得注意的是,通过上面的配置,卷将启动关闭静音,因此您在开始播放时需要应用VolumeShaper
,否则输出将保持静音。
要做到这一点,只需使用:
public void play() {
mMediaPlayer.start();
mVolumeShaper.apply(VolumeShaper.Operation.PLAY);
}
要暂停它,在暂停之前或在曲目结束时,只需反向应用它,如下所示:
public void setMuted(boolean muted) {
if (muted) {
mVolumeShaper.apply(VolumeShaper.Operation.REVERSE);
} else {
mVolumeShaper.apply(VolumeShaper.Operation.PLAY);
}
}