2017-06-29 1 views
0

Lorsque vous utilisez la nouvelle VolumeShaper dans Android O, je tente de le créer avec un MediaPlayer:MediaPlayer.createVolumeShaper lance une IllegalArgumentException: configuration ou opération non valide: -19

// 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(); 

Lorsque je tente de l'exécuter, cependant, il jette une exception:

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) 

Répondre

0

afin de créer un VolumeShaper, l'objet MediaPlayer doit être dans l'état « initialisé », ce qui arrive après avoir appelé setDataSource là-dessus. (Voir: MediaPlayer state diagram.)

Dans ce cas, il est aussi simple que de changer le code pour le faire dans cet ordre:

mMediaPlayer.setDataSource(context, uri); 
mMediaPlayer.prepareAsync(); 
mVolumeShaper = mMediaPlayer.createVolumeShaper(configuration); 

Il est également possible de retarder la création de VolumeShaper jusqu'à appeler .start() sur le MediaPlayer, et il est à noter que, avec la configuration ci-dessus, le volume commencera en sourdine, donc vous devrez appliquer le VolumeShaper au début de la lecture ou la sortie sera silencieuse.

Pour ce faire, il suffit d'utiliser ceci:

public void play() { 
    mMediaPlayer.start(); 
    mVolumeShaper.apply(VolumeShaper.Operation.PLAY); 
} 

Pour couper, avant la pause ou la piste se termine, il suffit d'appliquer à l'envers, comme ceci:

public void setMuted(boolean muted) { 
    if (muted) { 
     mVolumeShaper.apply(VolumeShaper.Operation.REVERSE); 
    } else { 
     mVolumeShaper.apply(VolumeShaper.Operation.PLAY); 
    } 
}