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:
Activity
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
:
Chciałbym rozwiązanieService
do:
BroadcastReceivers
i dodatków / zezwoleń na Manifest systemu Android, jeśli to możliweSamodzielne i sprawdzanie błędówInne 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();
}
}