Problemas con MediaPlayer, recursos crudos, detener e iniciar
Soy nuevo en el desarrollo de Android y tengo una pregunta / problema.
Estoy jugando con la clase MediaPlayer para reproducir algunos sonidos / música. Estoy jugando recursos crudos ( res/raw
) y se ve fácil.
- Reproductor multimedia android error 100
- ¿Cómo puedo reproducir un flujo de audio HTTP en directo en MediaPlayer en Android?
- ¿Cómo puedo configurar el permiso de archivo a MODE_WORLD_READABLE?
- En Android, controla (reproduce / pausa) reproductor multimedia desde el código externo
- Ayuda de Android: ¿Cómo abrir una URL de archivo de vídeo remota para reproducir en MediaPlayer sin tener que abrir una ventana del navegador?
Para reproducir un recurso sin formato, el MediaPlayer debe inicializarse de la siguiente manera:
MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song); mp.start();
Hasta aquí no hay problema. El sonido se reproduce, y todo funciona bien. Mi problema aparece cuando deseo agregar más opciones a mi aplicación. Específicamente cuando agrego el botón / opción "Detener".
Básicamente, lo que quiero hacer es … cuando presione "Stop", la música se detiene. Y cuando presiono "Start", la canción / sonido comienza de nuevo. (Bastante básico!)
Para detener el reproductor multimedia, sólo tiene que llamar a stop()
. Pero para reproducir el sonido de nuevo, el reproductor multimedia tiene que ser reseted y preparado.
mp.reset(); mp.setDataSource(params); mp.prepare();
El problema es que el método setDataSource()
sólo acepta como params una ruta de acceso de archivo, URI de Proveedor de Contenido, ruta de URL de medios de transmisión o Descriptor de Archivo.
Por lo tanto, dado que este método no acepta un identificador de recurso, no sé cómo configurar el origen de datos para llamar a prepare()
. Además, no entiendo por qué no puede utilizar un identificador de Resouce para establecer el origen de datos, pero puede utilizar un identificador de recurso al inicializar el MediaPlayer.
Supongo que me estoy perdiendo algo. Me pregunto si estoy mezclando conceptos, y el método stop()
no tiene que ser llamado en el botón "Stop". ¿Alguna ayuda?
¡¡¡Gracias por adelantado!!!
- Cómo desarrollar un simple reproductor de audio streaming android?
- Pausar / Detener MediaPlayer Android en un momento determinado mediante programación
- Problemas de almacenamiento intermedio con android.media.MediaPlayer
- Implementación de reproductor de audio en listview en android
- Cómo obtener el nombre de archivo de URI
- Error de MediaPlayer de Android al usar las llamadas de reinicio () y de liberación ()
- Media Player inicio parada inicio
- Android MediaPlayer atascado en preparar ()
Aquí es lo que hice para cargar múltiples recursos con un solo MediaPlayer:
/** * Play a sample with the Android MediaPLayer. * * @param resid Resource ID if the sample to play. */ private void playSample(int resid) { AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid); try { mediaPlayer.reset(); mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); mediaPlayer.prepare(); mediaPlayer.start(); afd.close(); } catch (IllegalArgumentException e) { Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e); } catch (IllegalStateException e) { Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e); } catch (IOException e) { Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e); }
MediaPlay es una variable miembro que se crea y se libera en otros puntos de la clase. Esto puede no ser la mejor manera (soy nuevo para Android), pero parece que funciona. Sólo tenga en cuenta que el código probablemente caerá a través de la parte inferior del método antes de que el mediaPlayer se termine jugando. Si necesita jugar una serie de recursos, todavía tendrá que manejar este caso.
Esto es cómo el método MediaPlayer.create funciona para abrir un archivo sin formato:
public static MediaPlayer create(Context context, int resid) { try { AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid); if (afd == null) return null; MediaPlayer mp = new MediaPlayer(); mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); afd.close(); mp.prepare(); return mp; } catch (IOException ex) { Log.d(TAG, "create failed:", ex); // fall through } catch (IllegalArgumentException ex) { Log.d(TAG, "create failed:", ex); // fall through } catch (SecurityException ex) { Log.d(TAG, "create failed:", ex); // fall through } return null; }
O bien, puede acceder al recurso de esta manera:
mediaPlayer.setDataSource(context, Uri.parse("android.resource://com.package.name/raw/song"));
Donde com.package.name es el nombre de su paquete de aplicación
Puedes usar
mp.pause(); mp.seekTo(0);
Para detener el reproductor de música.
Por último, la forma en que funciona para mí:
public class MainStart extends Activity { ImageButton buttonImage; MediaPlayer mp; Boolean playing = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonImage = (ImageButton)findViewById(R.id.ButtonID); buttonImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(playing){ mp.stop(); playing = false; }else{ mp = MediaPlayer.create(getApplicationContext(), R.raw.sound_u_want); mp.start(); playing = true; } } }); } }
SEÑOR. Rectángulo, este mensaje tal vez demasiado tarde para ello, pero orgullosamente escribo estos códigos a su idea: Tengo mp
para mediaplayer
y sescal9
es un button
.
.... if(btnClicked.getId() == sescal9_ornek_muzik.getId()) { mp.start(); mp.seekTo(380); mp2.start(); mp2.seekTo(360); mp3.start(); mp3.seekTo(340); ... }
- Android Build con Gradle y ProGuard: "El frasco de salida debe especificarse después de un tarro de entrada, o estará vacío"
- ¿Cómo puedo pasar correctamente los extras exclusivos a una intención pendiente?