我知道這個問題之前已經被問過好幾次,看起來可能是幾個問題的集合,但我覺得這對許多開發者來說都是相關且重要的;我需要創建一個背景音樂Service
可以在多個活動,爲我的Android遊戲應用程序時,結束該結束,在所有的下列情況暫停運行:跨多個活動的Android綜合失效音樂服務
- 一定
Activity
,有它自己的音樂開始。 (當此Activity
完成後繼續,這恰好是AndEngine
活動。) - 主屏幕被按下,應用程序會後退,或者應用程序被終止。當應用程序返回到前臺時繼續。需要使用
onUserLeaveHint()
。 Another helpful link. - 手機接到來電並中斷應用程序。電話處理完畢後繼續。需要使用
TelephonyManager
類似於this。 - 屏幕鎖定。 (屏幕解鎖後恢復。)需要使用
ACTION_USER_PRESENT
,這似乎是beveryproblematic。 - 基本上,音樂在應用程序未顯示或從用戶顯示#1的特殊活動時暫停。
以上就是我所需要的和我拼湊在一起的信息。 我目前的代碼基本上類似於this。
我覺得很奇怪的是AndEngine
管理有沒有這些問題與他們的音樂,也許看在源代碼將幫助別人尋找一個答案。我正在使用the last functional GLES1 version from Google Code。
我已經採取了看看下面的鏈接,以及如何建立一個好的音樂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
我想解決Service
到:
- 最小化
- 自給使用
BroadcastReceivers
和Android清單添加/權限,如果可能的話 和錯誤檢查
其他注意事項
- 目前所有需要背景音樂的活動都會擴展一個共同特色升級。
- 音樂需要循環播放,但只能播放單曲。
感謝大家提前!祝你好運!
編輯 - 下面是代碼片段,隨意提高或忽略:
媒體播放器包裝
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) {}
}
}
音樂服務
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() {
}
}
改進基本活動類
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();
}
}
我在試圖完成所有的目標自己的過程是,看到你的問題。任何進展?我會盡力讓你知道我完成後的情況。 – ajacian81 2012-10-01 18:00:31
@ ajacian81暫時還沒有上過這個網站,我們決定推遲推出這款音樂,並將其作爲beta版發佈。 – pqn 2012-10-21 18:13:21
好吧,我會讓你知道我的嘗試如何,我應該在一個月左右得到答案。 – ajacian81 2012-10-21 19:52:12