2015-01-29 10 views
6

Sto seguendo una serie di video conferenze di programmazione Android che è stata progettata nella pre-API 21 volte. Quindi mi dice di creare una variabile SoundPool nel modo seguente.impostare gli attributi audio nella classe SoundPool.Builder per l'API 21

SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); 
//SoundPool(int maxStreams, int streamType, int srcQuality) 

Tuttavia, voglio utilizzare anche questo SoundPool per l'API 21. Quindi, io sto facendo questo:

if((android.os.Build.VERSION.SDK_INT) == 21){ 
    sp21 = new SoundPool.Builder(); 
    sp21.setMaxStreams(5); 
    sp = sp21.build(); 
} 
else{ 
    sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); 
} 

SP21 è una variabile di Builder tipo per API 21 e SP è di SoundPool tipo.

Questo funziona molto bene con il mio AVD con API 21 e dispositivo reale con API 19. (Non ho provato con un dispositivo reale con API 21 ma penso che funzionerà bene). Ora, voglio impostare lo streamType su USAGE_MEDIA nel blocco if prima del sp = sp21.build();. Così ho tipo:

sp21.setAudioAttributes(AudioAttributes.USAGE_MEDIA); 

Ma il Lint segna in rosso e dice:

Il metodo setAudioAttributes (AudioAttributes) nel tipo SoundPool.Builder non è applicabile per gli argomenti (int)

So che anche se non lo imposto su USAGE_MEDIA verrà impostato sullo stesso valore predefinito. Ma sto chiedendo un riferimento futuro se devo impostarlo su qualcosa di diverso: USAGE_ALARM.

Come devo procedere?

Please Help!

Ho fatto riferimento a Audio Attributes, SoundPool, SoundPool.builder e AudioManager.

risposta

10

Un'istanza AudioAttributes viene creata tramite il suo builder, AudioAttributes.Builder.

È possibile utilizzarlo nel modo seguente.

sp21.setAudioAttributes(new AudioAttributes.Builder() 
.setUsage(AudioAttributes.USAGE_MEDIA) 
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
.build()); 

Rif: https://developer.android.com/reference/android/media/AudioAttributes.html

+0

dimenticato di include.setMaxStreams (5), in linea # 3 –

9

ho qualcosa da aggiungere qui. Stavo usando SoundPool nella mia app di gioco per riprodurre file audio ogg piccoli e semplici. Funzionava bene anche su emulatori con API 21. Oggi ho deciso di modificarlo per utilizzare SoundPool.Builder().

Ho esaminato il documento SoundPool.Builder di Android. Dice che c'è

public static class 
SoundPool.Builder 
extends Object 
java.lang.Object 
↳ android.media.SoundPool.Builder 
Class Overview 
Builder class for SoundPool objects. 

Nota la riga "Classe builder per oggetti SoundPool". Così SoundPool.Builder() crea l'oggetto SoundPool. SoundPool() crea anche oggetti SoundPool. Quindi questo è quello che ho fatto.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 

     AudioAttributes audioAttrib = new AudioAttributes.Builder() 
       .setUsage(AudioAttributes.USAGE_GAME) 
       .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
       .build(); 
     mSound = new SoundPool.Builder().setAudioAttributes(audioAttrib).setMaxStreams(6).build(); 
    } 
    else { 

     mSound = new SoundPool(6, AudioManager.STREAM_MUSIC, 0); 
    } 

mSound è dichiarato come

private SoundPool mSound; 

resto del codice (dove io carico, play, stop, suono stampa) rimane esattamente come era in precedenza. E si sta lavorando in API 21 e versioni precedenti

Spero che questo ti aiuta tutti

+0

Questa risposta è meglio. – LukTar

+0

lo stesso vale per la chiamata al metodo MediaPlayer.SetAudioAttributes() –