Kompleksowa usługa muzyczna dla Androida z wieloma funkcjami

Wiem, że to pytanie było zadawane wiele razy i może wydawać się zlepkiem kilku pytań, ale uważam, że jest ono istotne i ważne dla wielu programistów; Muszę stworzyć muzykę w tleService które mogą natrafić na wiele działań w mojej grze na Androida, która kończy się wraz z zakończeniem aplikacji i zatrzymuje się we wszystkich następujących okolicznościach:

PewienActivity który ma własną muzykę. (Wznów, gdy to nastąpiActivity wykończenia. Tak się dziejeAndEngine czynność.)Zostanie naciśnięty ekran główny, aplikacja będzie działać w tle lub aplikacja zostanie zakończona. Wznawia, gdy aplikacja wraca na pierwszy plan. Wymaga użyciaonUserLeaveHint(). Kolejny pomocny link.Telefon odbiera połączenie i przerywa aplikację. Wznawia, gdy rozmowa zostanie rozpatrzona. Wymaga użyciaTelephonyManager podobny doto.Ekran jest zablokowany. (Wznawia po odblokowaniu ekranu.) Wymaga użyciaACTION_USER_PRESENT, co wydaje siębyć bardzo problematyczny.Zasadniczo muzyka zatrzymuje się, gdy aplikacja nie jest wyświetlana lub gdy aktywność specjalna z # 1 jest pokazywana użytkownikowi.

Powyżej jest wszystko, czego potrzebuję i informacje, które złożyłem razem.Mój obecny kod zasadniczo przypominato.

Uważam to za ciekaweAndEngine nie ma problemów z muzyką, więc szukanie kodu źródłowego może pomóc komuś w znalezieniu odpowiedzi. używamostatnia funkcjonalna wersja GLES1 z Google Code.

Przyjrzałem się następującym linkom, a także tworzeniu dobrej muzykiService:

Zatrzymywanie muzyki w tlehttp://www.codeproject.com/Articles/258176/Adding-Background-Music-to-Android-AppAndroid muzyka w tleOdtwarzanie muzyki BG przez działania w Androidziehttp://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion

Chciałbym rozwiązanieService do:

Zminimalizuj użycieBroadcastReceivers i dodatków / zezwoleń na Manifest systemu Android, jeśli to możliweSamodzielne i sprawdzanie błędów

Inne notatki

Obecnie wszystkie działania wymagające podkładu muzycznego rozszerzają wspólną klasę specjalną.Muzyka musi być zapętlona, ​​ale uruchamia tylko jedną ścieżkę.

Dziękujemy wszystkim z wyprzedzeniem! Powodzenia!

Edytuj - oto fragmenty kodu, możesz je ulepszyć lub zignorować:

Opakowanie odtwarzacza multimedialnego

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) {}
    }
}

Serwis muzyczny

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() {

    }
}

Poprawiona podstawowa klasa aktywności

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

}

questionAnswers(3)

yourAnswerToTheQuestion