pro mediaplayer mecool m8s library example ejemplo developer create android media-player

mecool - mediaplayer android ejemplo



Problemas con MediaPlayer, recursos en bruto, detener y comenzar. (6)

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 parece algo fácil.

Para reproducir un recurso en bruto, MediaPlayer debe inicializarse así:

MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song); mp.start();

Hasta aquí no hay problema. Se reproduce el sonido, y todo funciona bien. Mi problema aparece cuando quiero 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 presiono "Detener", la música se detiene. Y cuando presiono "Inicio", la canción / sonido comienza de nuevo. (bastante básico!)

Para detener el reproductor multimedia, solo tiene que llamar a stop() . Pero para reproducir el sonido de nuevo, el reproductor de medios debe ser reiniciado y preparado.

mp.reset(); mp.setDataSource(params); mp.prepare();

El problema es que el método setDataSource() solo acepta como parámetros una ruta de archivo, URI de proveedor de contenido, ruta de URL de medio de transmisión o descriptor de archivo.

Entonces, como este método no acepta un identificador de recursos, no sé cómo configurar el origen de datos para poder llamar a prepare() . Además, no entiendo por qué no puede usar un identificador de Recurso para establecer el origen de los datos, pero puede usar un identificador de recursos al inicializar 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!!!


Así es como funciona el método MediaPlayer.create para abrir un archivo en bruto:

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; }


Esto 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 libera en otros puntos de la clase. Puede que esta no sea la mejor manera (yo mismo soy nuevo en Android), pero parece funcionar. Solo tenga en cuenta que el código probablemente caerá a la parte inferior del método antes de que el mediaPlayer termine de reproducirse. Si necesita jugar una serie de recursos, todavía necesitará manejar este caso.


Finalmente, 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; } } }); } }


O bien, podría 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.


SEÑOR. Rectángulo, este mensaje quizás sea demasiado tarde para eso, pero con orgullo escribo estos códigos según tu 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); ... }