Android MediaPlayer.createVolumeShaper引发IllegalArgumentException:配置或操作无效:-19

Android MediaPlayer.createVolumeShaper引发IllegalArgumentException:配置或操作无效:-19,android,android-mediaplayer,Android,Android Mediaplayer,在Android O中使用新的VolumeShaper时,我尝试使用MediaPlayer创建它: // Create a VolumeShaper configuration VolumeShaper.Configuration volumeShaperConfig = new VolumeShaper.Configuration.Builder() .setDuration(3000) .setCurve

在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)
原因:java.lang.IllegalArgumentException:配置或操作无效:-19
位于android.media.VolumeShaper.applyPlayer(VolumeShaper.java:189)
在android.media.VolumeShaper.(VolumeShaper.java:54)
在android.media.MediaPlayer.createVolumeShaper上(MediaPlayer.java:1392)

为了创建
VolumeShaper
MediaPlayer
对象必须处于“初始化”状态,这是在调用
setDataSource
后发生的。(见:)

在这种情况下,只需按以下顺序更改代码即可:

mMediaPlayer.setDataSource(context, uri);
mMediaPlayer.prepareAsync();
mVolumeShaper = mMediaPlayer.createVolumeShaper(configuration);
还可以延迟创建VolumeShaper,直到在
MediaPlayer
上调用
.start()
,值得注意的是,使用上述配置时,卷将开始静音,因此开始播放时需要应用
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);
    }
}

要创建
VolumeShaper
MediaPlayer
对象必须处于“初始化”状态,这是在调用
setDataSource
后发生的。(见:)

在这种情况下,只需按以下顺序更改代码即可:

mMediaPlayer.setDataSource(context, uri);
mMediaPlayer.prepareAsync();
mVolumeShaper = mMediaPlayer.createVolumeShaper(configuration);
还可以延迟创建VolumeShaper,直到在
MediaPlayer
上调用
.start()
,值得注意的是,使用上述配置时,卷将开始静音,因此开始播放时需要应用
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);
    }
}