2015-01-29 6 views
6

Ich folge einer Video-Vortragsreihe von Android Programming, die in der Pre-API 21 mal entworfen wurde. Daher sagt es mir, eine SoundPool-Variable auf folgende Weise zu erstellen.Audio-Attribute in der SoundPool.Builder-Klasse für API 21 setzen

Allerdings möchte ich diesen SoundPool auch für API 21 verwenden. Also, ich tue dies:

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 ist eine Variable vom Typ Builder für API 21 und sp von SoundPool Typ.

Dies funktioniert sehr gut mit meinem AVD mit API 21 und Real-Gerät mit API 19. (Habe nicht mit einem echten Gerät mit API 21 versucht, aber ich denke, es wird gut funktionieren). Nun möchte ich die streamType auf USAGE_MEDIA im if-Block vor sp = sp21.build(); setzen. So Typ I:

sp21.setAudioAttributes(AudioAttributes.USAGE_MEDIA); 

Aber die Lint markiert es in rot und sagt:

Die Methode setAudioAttributes (AudioAttributes) in der Art SoundPool.Builder für die Argumente nicht anwendbar ist (int)

Ich weiß, dass selbst wenn ich es nicht auf USAGE_MEDIA einstellen wird es standardmäßig auf die gleiche gesetzt wird. Aber ich frage nach einer zukünftigen Referenz, wenn ich es auf etwas anderes wie: USAGE_ALARM setzen muss.

Wie soll ich fortfahren?

Bitte Hilfe!

Ich habe auf Audio Attributes, SoundPool, SoundPool.builder und AudioManager verwiesen.

Antwort

10

Eine AudioAttributes-Instanz wird über ihren Builder, AudioAttributes.Builder, erstellt.

Sie können es auf folgende Weise verwenden.

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

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

+0

zu include.setMaxStreams vergessen (5) in Zeile # 3 –

9

ich etwas hier hinzufügen. Ich benutzte SoundPool in meiner Spiel-App, um kleine und einfache Ogg-Audiodateien abzuspielen. Es funktionierte sogar auf Emulatoren mit API 21. Heute habe ich beschlossen, es zu ändern, um SoundPool.Builder() zu verwenden.

Ich schaute Android SoundPool.Builder Dokument. Dort steht

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

Beachten Sie die Zeile "Builder-Klasse für SoundPool-Objekte." So SoundPool.Builder() erstellt SoundPool-Objekt. SoundPool() erstellt auch SoundPool-Objekt. Also das habe ich getan.

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 als

private SoundPool mSound; 

Rest des Codes deklariert wird (wo ich laden, Play, Stop, Freigabe Ton) bleibt genau so, wie es früher war. Und es funktioniert in API 21 und früheren Versionen

hoffe, das hilft Ihnen, alle

+0

Diese Antwort ist besser. – LukTar

+0

Das gleiche gilt für den Aufruf der MediaPlayer.SetAudioAttributes() -Methode –