MediaPlayer.createVolumeShaper抛出IllegalArgumentException:无效的配置或操作:-19

时间:2017-06-29 19:00:50

标签: android android-mediaplayer

在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)

1 个答案:

答案 0 :(得分:0)

为了创建VolumeShaperMediaPlayer对象必须位于&#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);
    }
}