Sé que esta pregunta se ha hecho muchas veces antes y podría parecer un conglomerado de varias preguntas, pero creo que es relevante e importante para muchos desarrolladores; Necesito crear una música de fondo Service
que se puede ejecutar a través de múltiples actividades para mi juego para Android que termina cuando se termina la aplicación y se detiene en todas las circunstancias siguientes:Servicio integral de música a prueba de fallas de Android en múltiples actividades
- Un cierto
Activity
que tiene su propia música se inicia . (Reanudar cuando finalice esteActivity
. Esta es una actividadAndEngine
). - Se presiona la pantalla de inicio y la aplicación tiene un fondo o la aplicación finaliza. Se reanuda cuando la aplicación vuelve al primer plano. Requiere el uso de
onUserLeaveHint()
. Another helpful link. - El teléfono recibe una llamada e interrumpe la aplicación. Se reanuda cuando la llamada ha sido tratada. Requiere el uso de
TelephonyManager
similar a this. - La pantalla está bloqueada. (Se reanuda después de desbloquear la pantalla.) Requiere el uso de
ACTION_USER_PRESENT
, que parece beveryproblematic. - Básicamente, la música se detiene cuando la aplicación no se muestra o cuando la actividad especial del # 1 se muestra al usuario.
Above es todo lo que necesito y la información que he reconstruido. Mi código actual básicamente se parece a this.
Me resulta curioso que AndEngine
no tenga ninguno de estos problemas con su música, por lo que quizás buscar en el código fuente ayudaría a alguien a buscar una respuesta. Estoy usando the last functional GLES1 version from Google Code.
He echado un vistazo a los siguientes enlaces, así en la creación de una buena música Service
:
- Stopping Background Service Music
- http://www.codeproject.com/Articles/258176/Adding-Background-Music-to-Android-App
- Android background music service
- Playing BG Music Across Activities in Android
- http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion
Me gustaría que la solución Service
a:
- minimizar el uso de
BroadcastReceivers
y Android Manifiesto adiciones/permisos, si es posible - independiente y comprobación de errores
Otras Notas
- En la actualidad, todas las actividades que requieren música de fondo se extienden a una especie común l clase.
- La música necesita repetirse pero solo ejecuta una sola pista.
Gracias a todos por adelantado! ¡La mejor de las suertes!
Editar - Estas son fragmentos de código, no dude en mejorar o ignorar:
Media Player Envoltura
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.preference.PreferenceManager;
import android.util.Log;
public class CarefulMediaPlayer {
final SharedPreferences sp;
final MediaPlayer mp;
private boolean isPlaying = false;
public CarefulMediaPlayer(final MediaPlayer mp, final MusicService ms) {
sp = PreferenceManager.getDefaultSharedPreferences(ms.getApplicationContext());
this.mp = mp;
}
public void start() {
if (sp.getBoolean("com.embed.candy.music", true) && !isPlaying) {
mp.start();
isPlaying = true;
}
}
public void pause() {
if (isPlaying) {
mp.pause();
isPlaying = false;
}
}
public void stop() {
isPlaying = false;
try {
mp.stop();
mp.release();
} catch (final Exception e) {}
}
}
servicio de música
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class MusicService extends Service {
static CarefulMediaPlayer mPlayer = null;
@Override
public IBinder onBind(final Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
final MediaPlayer mp = MediaPlayer.create(this, R.raw.title_music);
mp.setLooping(true);
mPlayer = new CarefulMediaPlayer(mp,this);
}
@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
mPlayer.start();
return 1;
}
@Override
public void onStart(final Intent intent, final int startId) {
}
public IBinder onUnBind(final Intent arg0) {
return null;
}
public static void onStop() {
mPlayer.stop();
}
public static void onPause() {
if (mPlayer!=null) {
mPlayer.pause();
}
}
public static void onResume() {
if (mPlayer!=null) {
mPlayer.start();
}
}
@Override
public void onDestroy() {
mPlayer.stop();
mPlayer = null;
}
@Override
public void onLowMemory() {
}
}
Mejora de la base de tipo de actividad
import android.app.Activity;
import android.content.Intent;
import android.os.PowerManager;
import android.telephony.TelephonyManager;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
public abstract class BetterActivity extends Activity {
private boolean isHome = true;
@Override
protected void onResume() {
System.gc();
super.onResume();
MusicService.onResume();
isHome = true;
}
@Override
protected void onPause() {
if (((TelephonyManager)getSystemService(TELEPHONY_SERVICE)).getCallState()==TelephonyManager.CALL_STATE_RINGING
|| !((PowerManager)getSystemService(POWER_SERVICE)).isScreenOn()) {
MusicService.onPause();
}
super.onPause();
System.gc();
}
@Override
public boolean onKeyDown (final int keyCode, final KeyEvent ke) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
isHome = false;
default:
return super.onKeyDown(keyCode, ke);
}
}
@Override
public void startActivity(final Intent i) {
isHome = false;
super.startActivity(i);
}
@Override
protected void onUserLeaveHint() {
if (isHome) {
MusicService.onPause();
}
super.onUserLeaveHint();
}
}
Estoy en el proceso de tratar de lograr todos sus objetivos de mí y vi tu pregunta. ¿Cualquier progreso? Intentaré hacerte saber cómo va esto cuando termine. – ajacian81
@ ajacian81 hace tiempo que no visitamos el sitio, decidimos retrasar la música y lanzarla antes como versión beta. – pqn
bien, bien. Te dejaré saber cómo va mi intento, debería tener algunas respuestas en un mes más o menos. – ajacian81