(Android MediaPlayer) Comment suis-je censé appeler setAudioStreamType() si MediaPlayer.créer() appelle implicitement prepare()?
Je suis en train d'écrire un Android application alarme qui utilise un Service dans le but de jouer la tonalité de l'alarme. Actuellement, je suis en mesure d'obtenir l'audio à jouer, mais il joue dans une forme qui peut être coupé en tournant le dispositif de volume. Donc, je suis en train d'ajouter un appel à setAudioStreamType(AudioManager.STREAM_ALARM);
pour l'en empêcher.
J'ai le texte suivant pour mon onStartCommand()
fonction pour le service:
MediaPlayer mMP;
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
try
{
mMP = MediaPlayer.create(this, R.raw.alarm);
mMP.setAudioStreamType(AudioManager.STREAM_ALARM);
mMP.setLooping(true);
//mMP.prepare(); commented out since prepare() is called in create
}
catch (Exception e)
{
e.printStackTrace();
}
if (mMP != null) mMP.start();
return START_STICKY;
}
Mon problème est que, avec l'appel à setAudioStreamType(), le lecteur multimédia ne joue jamais l'audio. Si je commente cette ligne, la lecture audio.
Avec la ligne, j'obtiens l'erreur d'exécution suivant(s):
04-10 19:32:03.115: E/MediaPlayer(3411): setAudioStream appelé dans l'état 8
04-10 19:32:03.115: E/MediaPlayer(3411): erreur (-38, 0)
04-10 19:32:03.115: E/MediaPlayer(3411): démarrer appelé à l'état 0
04-10 19:32:03.115: E/MediaPlayer(3411): erreur (-38, 0)
04-10 19:32:03.115: E/MediaPlayer(3411): Erreur (-38,0)
04-10 19:32:03.115: E/MediaPlayer(3411): Erreur (-38,0)
Quelques recherches (je ne trouve pas le lien maintenant) m'a dit que setAudioStreamType()
ne peut pas être appelé après prepare()
a été appelé, et que create()
appelle implicitement prepare()
.
En tout ce qui concerne, comment suis-je censé setAudioStreamType()
sans une telle erreur?
OriginalL'auteur finiteloop | 2012-04-10
Vous devez vous connecter pour publier un commentaire.
Vous pouvez soit appeler
mp.reset()
et puis définissez le type de flux de données, la source de données, puis de préparer. Alternativement suffit d'utiliser le constructeur par défaut et de gérer l'initialisation de vous-même.EDIT:
create()
):reset();
setAudioStreamType();
setLooping();
prepare();
Suis-je la corriger? Si oui, j'obtiens l'erreur suivante lors de l'appel de préparation:04-10 20:06:25.515: E/MediaPlayer(845): start called in state 1
04-10 20:06:25.515: E/MediaPlayer(845): error (-38, 0)
Semble que vous êtes l'obtention de l'erreur sur l'appel à
start()
, en fait, pasprepare()
. Pouvez-vous ajouter votre code mis à jour à la question?Vous avez raison, cette erreur a été posée après l'appel à démarrer, il y a aussi une erreur sur l'appel à préparer que j'ai raté dans le journal quand j'ai été poster mon commentaire.
04-10 21:42:11.896: E/MediaPlayer(593): prepareAsync called in state 1
.Aussi, la seule différence entre ce que j'essaie maintenant et ce qui est affiché ci-dessus est que la
prepare()
appel est retirée, etreset()
est appelée juste aprèscreate()
.Ouais, une fois que vous réinitialisez-le, c'est complètement non initialisé, c'est pourquoi je suis assez certain que vous pouvez simplement utiliser le constructeur par défaut (sauf si il y a certaines fonctionnalités de base dans le
create()
méthode qui doit être initialisé autres que les fonctions ci-dessus) et enregistrer l'appel àcreate()
entièrement. Essayez l'exemple ci-dessus et laissez-moi savoir si cela fonctionne pour vous.OriginalL'auteur kcoppock
Accepté de réponse a été de lancer un IllegalStateException. Ce travail est
OriginalL'auteur Maragues