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.

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!!!

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 media player - cómo deshabilitar la gama de solicitud? (Rotura de audio roto en Nexus 7)
  • Reproductor multimedia mediaplayer (658): error (1, -2147483648)
  • MediaPlayer en subproceso separado utilizando Service o IntentService
  • Android - MediaPlayer tamaño de búfer en ICS 4.0
  • Android: ¿Cómo configurar el volumen de MediaPlayer mediante programación?
  • Android: reproductor nativo con subtítulos
  • Android MediaPlayer Detener y reproducir
  • Android Problemas al reproducir archivos de audio
  • Mostrar la hora en que se reproduce la canción en android
  • Android: ¿Cómo crear un reproductor de vídeo?
  • ¿Determinar la estructura de opencore o stagefright para mediaplayer?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.