Cómo mantener única instancia de MediaPlayer

Estoy utilizando la clase de reproductor de medios de android para reproducir sonido de notificación en mi aplicación de Android.

MediaPlayer player = MediaPlayer.create(getApplicationContext(), R.raw.notify); player.setLooping(false); player.start(); 

Necesito jugar diversos sonidos de la notificación en diversas actividades, así que cada vez que necesito jugar el sonido que necesito crear la instancia del reproductor multimedia y entonces necesito decir comienzo.

Pero en lugar de hacer esto, ¿Cómo puedo mantener única instancia del reproductor multimedia en toda la aplicación y utilizarlo en todas las actividades para reproducir los sonidos.

¿Puede alguien por favor sugerirme la mejor manera de implementarlo. Desde mi punto de vista voy a crear una clase de singleton y voy a agregar toda la función relacionada con MediaPlayer en esta clase.

Gracias.

Usted debe considerar el patrón Singleton . Hacer una clase MyPlayer que tiene un método estático getMediaPlayer() que devuelve la misma instancia de MediaPlayer cada vez que se llama.

Siempre hago algo similar con una versión modificada de Singleton Pattern . Dado que el contexto es necesario en todas partes en Android, paso el contexto a la instancia:

 public class Asset{ public static Asset(Context context); } 

También puede tener diferentes singleton en diferentes contextos, en esta implementación, por ejemplo:

 private static Hashtable<Context, Asset> instances; public static Asset(Context context){ if (!instances.containKey(context)){ instances.put(context, new Asset(context)); return instances.get(context); } 

La ventaja de esto se compara con singleton clásico, es que puede definir el alcance de sus singletons. A veces solo necesitas que la instancia permanezca en la misma Actividad, pero la segunda Actividad puede tener instancia diferente. Si lo necesita en diferentes actividades, sólo tiene que pasar context.getApplicationContext ().

Elaborar un poco más sobre las consideraciones singleton:

Nota: aquí, el problema de la falla de Audioservice al crear una serie de jugadores consecutivamente (digamos 20 mediaPlayers) se trata también.

Creación del reproductor: la clase singleton debería crear otro subproceso para manejar las operaciones de mediaplayer (no el subproceso principal de UI)

Create Player Runnable : Este subproceso (creado por la instancia singleton debería tener prioridad de fondo, un retraso de "Thread.sleep (500);" antes de la lógica de creación para permitir que el AudioService – usado por MediaPlayer.create () Trabajo ya que el método posterior vuelve al instante.

Crear código Runnable del jugador :

 /** * Created by George hannuneh on 10/12/2015. * Holds the background work for creating a media player */ public class CreatePlayerRunnable implements Runnable { static final int CREATE_STATE_FAILED = -1; static final int CREATE_STATE_STARTED= 0; static final int CREATE_STATE_COMPLETED= 1; private static final String TAG ="CreatePlayerRunnable"; private static int sRunnablesCount = 1; final TaskRunnableCreatePlayerMethods mPlayerTask; /** * * An interface that defines methods that PlayerCreationTask implements. An instance of * CreatePlayerTask passes itself to an CreatePlayerRunnable instance through the * CreatePlayerRunnable constructor, after which the two instances can access each other's * variables. */ interface TaskRunnableCreatePlayerMethods { /** * Sets the Thread that this instance is running on * @param currentThread the current Thread */ void setCreatePlayerThread(Thread currentThread); Context getActivity(); Uri getMediaUri(); void handleCreationState(int createStateFailed); void setPlayer(MediaPlayer returnMediaPlayer); String getPlayerId(); MediaPlayer getPlayer(); } /** * This constructor creates an instance of CreatePlayerRunnable and stores in it a reference * to the CreatePlayerTask instance that instantiated it. * * @param createPlayerTask The CreatePlayerTask */ CreatePlayerRunnable(TaskRunnableCreatePlayerMethods createPlayerTask) { mPlayerTask = createPlayerTask; } @Override public void run() { /* * Stores the current Thread in the CreatePlayerTask instance, * so that the instance * can interrupt the Thread. */ mPlayerTask.setCreatePlayerThread(Thread.currentThread()); // Moves the current Thread into the background android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); MediaPlayer returnMediaPlayer = null; try { Thread.sleep(500); // Before continuing, checks to see that the Thread hasn't // been interrupted if (Thread.interrupted()) { throw new InterruptedException(); } returnMediaPlayer = MediaPlayer.create(mPlayerTask.getActivity(), mPlayerTask.getMediaUri()); if (returnMediaPlayer == null) { Log.e("CreatePlayerRunnable", mPlayerTask.getMediaUri()+ " - failed to create player"); return; } PlayerEventsHandler playerEvents = new PlayerEventsHandler(mPlayerTask.getPlayerId()); returnMediaPlayer.setLooping(true); returnMediaPlayer.setOnCompletionListener(playerEvents); returnMediaPlayer.setOnErrorListener(playerEvents); returnMediaPlayer.setVolume(0f, 0f); returnMediaPlayer.start(); } catch (InterruptedException e1) { // Does nothing } catch(Exception e) { returnMediaPlayer = null; e.printStackTrace(); } finally { if(MainActivity.DEBUG_MODE_ENABLED){ Log.d(TAG, "end of runnable: "+ sRunnablesCount++); } if (null == returnMediaPlayer){ mPlayerTask.handleCreationState(CREATE_STATE_FAILED); } else { mPlayerTask.setPlayer(returnMediaPlayer); // Reports a status of "completed" mPlayerTask.handleCreationState(CREATE_STATE_COMPLETED); } // Sets the current Thread to null, releasing its storage mPlayerTask.setCreatePlayerThread(null); // Clears the Thread's interrupt flag Thread.interrupted(); } } 

}

  • Mediaplayer cortando el sonido demasiado pronto
  • ¿Cómo filtrar sólo los archivos multimedia relevantes en Android?
  • Android - Reproducir mp3 directamente desde el flujo de entrada sin escribir en archivos temporales
  • Prácticas recomendadas para la transmisión de audio
  • Streaming de vídeos de Youtube
  • Debe tener controlador de subtítulos ya establecido error Mediaplayer Android
  • ¿Cómo detener MediaPlayer corriente y luego reiniciarlo? Androide
  • MediaPlayer de Android setSurface mientras está en estado de pausa
  • Android: Cómo integrar un decodificador al marco multimedia
  • ¿Cómo usar Wake Lock para android mediaplayer?
  • Rtsp rendimiento de vídeo como navegador provocado intención vs mi intención activada por la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.