Android MediaPlayer.createVolumeShaper引发IllegalArgumentException:配置或操作无效:-19
在Android O中使用新的VolumeShaper时,我尝试使用MediaPlayer创建它: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
// 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);
}
}