2011-07-27 5 views
5

Escribí una pequeña aplicación de prueba de control de reproducción de música. Tengo un botón reproducir, pausar, detener y rebobinar. Mi problema es que player.stop(); se comporta de la misma manera que player.pause(); Llamo a player.prepare() justo después de player.stop() para que pueda tener la instancia del reproductor lista para la operación de inicio().Instancia de MediaPlayer: stop se comporta como una pausa

No veo ningún error [IOexceptions o IllegalStateExceptions] que surgen al llamar a prepare() después de hacer una parada(). Además, no estoy llamando a ningún seekTo (0) después de detener(). Por lo tanto, no estoy estableciendo la posición de nuevo al comienzo de la canción.

Estoy usando un teléfono Nexus Google One con 2.3.4.

Alguna idea si estoy haciendo algo estúpido o si lo que estoy observando es en realidad cómo se fabricó la máquina de estado.

TIA.

+0

Han pasado tres años desde que hizo las preguntas, y la duda es también la misma. . . Solo quería comprobar el tiempo que han actualizado la API para que después de la parada comience desde el inicio? – user3726986

+0

@ user3726986 pls mira mis comentarios en el hilo que ha "aceptado" la respuesta. Eso fue en 2011. Aún debería funcionar. –

Respuesta

2

¿No dice el diagrama de estado http://developer.android.com/reference/android/media/MediaPlayer.html que detener significa "permanecer en estado detenido"?

La llamada al detener() detiene la reproducción y hace que un MediaPlayer en el estado Iniciado, En pausa, Preparado o Reproducción completada ingrese el estado Detenido.

Una vez en el estado Detenido, la reproducción no se puede iniciar hasta que se llame a prepare() o prepareAsync() para volver a establecer el objeto MediaPlayer en el estado Preparado. Llamar a stop() no tiene efecto en un objeto MediaPlayer que ya se encuentra en el estado Detenido.

No hay ninguna afirmación de que stop() debe cambiar el CurrentPosition.

No hay afirmación de que llamar al prepare() debería cambiar el CurrentPosition.

Por lo tanto, para ir al comienzo de la música, debe establecer manualmente su posición.

Pero estoy de acuerdo contigo. Como el método pause() indica que continuará reproduciéndose desde la posición actual, esperaría que vuelva al principio cuando se llame al stop().

Y tiene cierto impacto cuando es necesario llamar a la prepare()

Por ejemplo, la llamada para preparar() puede tomar mucho tiempo para ejecutarse, ya que podría implicar ir a buscar los medios de comunicación y decodificación de datos.

por lo stop() tiene que llamar prepare() que puede hacer que tome más tiempo, mientras que pause() tiene menos impacto: se puede llamar al start() justo después.

+0

La pregunta es cuando pasa del estado detenido al estado preparado y luego llama a inicio(), ¿esperamos que la canción comience desde el principio o desde el punto donde se detuvo el reproductor? Siento que debería comenzar desde el principio, pero estoy observando que está comenzando desde el punto donde se detuvo. Entonces, me hace pensar que no hay diferencia entre stop() y pausa(). Corrígeme si estoy equivocado. –

+0

Es lo que esperaría que se comportara, pero ... eche un vistazo que 'detener 'no lo hace ir a otra posición (no hay nada que diga que iría). Y getCurrentPosition() funciona incluso en el estado detenido. – woliveirajr

+0

hhmm ... esperaría que getCurrentPosition() en estado detenido devuelva 0. entonces, ¿cuál es la diferencia entre pause()? y pare()? por qué tienen dos estados que esencialmente funcionan de la misma manera. Acordó que no necesita llamar a prepare() después de pause(). Pero desde la perspectiva del usuario, no hay diferencia en estos dos estados. Gracias woliveirajr. –

3

creo que esto podría ser un error, ya que la documentación de la API para el método de inicio MediaPlayer sugiere el comportamiento que se espera:

inicio public void()

Inicia o reanuda la reproducción. Si la reproducción se había pausado previamente, la reproducción de continuará desde donde se pausó. Si la reproducción se ha detenido , o nunca se ha iniciado antes, la reproducción comenzará en el comenzando.

Por el momento, llamar explícitamente seekTo (0) una vez que el jugador está preparado parece ser una solución razonable.

Cuestiones relacionadas