簡體   English   中英

在 Android 中跨活動播放 BG 音樂

[英]Playing BG Music Across Activities in Android

你好! 第一次在 stackoverflow 上提問。 令人興奮! 哈哈。

我們正在開發一個 Android 游戲,我們為我們的介紹播放一些背景音樂(我們有一個介紹活動),但我們希望它繼續播放到下一個活動,也許能夠從任何地方停止或再次播放音樂應用程序。

我們目前正在做的是在我們的介紹活動中使用 MediaPlayer 播放背景音樂。 但是,一旦用戶離開該 Activity,我們就會停止播放音樂。 我們是否必須為此使用服務之類的東西? 或者 MediaPlayer/SoundPool 足夠了嗎? 如果有人知道答案,我們將非常感謝您與我們分享。 謝謝!

您還可以創建一個使用媒體播放器播放音樂的服務,如下所示。

Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc); //OR stopService(svc); 

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
    MediaPlayer player;
    public IBinder onBind(Intent arg0) {

        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();


        player = MediaPlayer.create(this, R.raw.idil);
        player.setLooping(true); // Set looping
        player.setVolume(100,100);

    }
    public int onStartCommand(Intent intent, int flags, int startId) {


        player.start();

        return 1;
    }

    public void onStart(Intent intent, int startId) {
        // TODO



    }
    public IBinder onUnBind(Intent arg0) {
        // TODO Auto-generated method stub

        return null;
    }

    public void onStop() {

    }
    public void onPause() {

    }
    @Override
    public void onDestroy() {

        player.stop();
        player.release();
    }

    @Override
    public void onLowMemory() {

    }
}

使用 SoundPools 或 MediaPlayers 創建靜態 SoundManager。

創建一個名為 keepMusicGoing 的靜態標志。

創建第一個活動時開始播放音樂。

切換活動時,將 keepMusicGoing 設置為 true。

在您的活動的 onStop 事件中檢查 keepMusicGoing 是否為 true,如果是,請打開音樂,然后將 keepMusicGoing 設置為 false。

如果他們按下主頁按鈕,keepMusicGoing 標志將為假,因此當活動失去焦點時音樂將停止。

給我發電子郵件,我可以給你發送幾個我寫的 SoundManagers,一個使用 MediaPlayers,另一個使用 SoundPools

乍得

如果我正確理解您的情況,那么我遇到過幾次同樣的問題。 我正在使用不同的線程在我的應用程序中播放音樂。 這個實現傳遞了一個對 Context 的靜態引用,我知道它在音樂播放時會一直存在。

public class AudioPlayer extends Thread {
private Context c;
private Thread blinker;
private File file;

public AudioPlayer (Context c, File file) {
    this.c = c;
    this.file = file;
}

public void go () {
    blinker = this;
    if(!blinker.isAlive()) {
        blinker.start();
    }
}

public void end () {
    Thread waiter = blinker;
    blinker = null;
    if (waiter != null)
        waiter.interrupt ();
}

public void run () {
    MediaPlayer ap = MediaPlayer.create(c, Uri.fromFile(file));
    int duration = ap.getDuration();
    long startTime = System.currentTimeMillis();
    ap.start();
    try {
        Thread thisThread = Thread.currentThread();
        while (this.blinker == thisThread && System.currentTimeMillis() - startTime < duration) {           
            Thread.sleep (500);  // interval between checks (in ms)
        }
        ap.stop ();
        ap.release ();
        ap = null;
    } catch (InterruptedException e) {
        Log.d("AUDIO-PLAYER", "INTERRUPTED EXCEPTION");
        ap.stop ();
        ap.release();
        ap = null;
    }
    }
}

首先,我使用了 Chad 提供的方法 where 來保留“keepMusicPlaying”標志。 我認為只使用活動的 onStart 和 onStop 方法更優雅。

創建一個自己的類“SoundManager”,並從您的所有活動 onStart 和 onStop(或使用基本活動類)調用其中的一些 onStart 和 onStop 類。 使用 startCounter 跟蹤 onStart 和 onStop(onstart 中的 startCounter++ 和 onstop 中的 startCounter-- 在 onstop 中)。 因為新活動的開始是在舊活動的 onStop 之前調用的,所以您總是知道 onStart 是第一次調用 (startCounter == 1) 還是從另一個活動開始 (startCounter == 2)。 與 onStope 相同(startCounter == 0 表示應用程序已關閉,startCounter == 1 表示它只是從舊活動停止,但有一個新活動)。

通過這種方式,您可以將所有內容封裝到 SoundManager 中,而不必在應用程序內啟動的每個活動上調用一些 keepMusicPlaying 方法/標志。

    public void OnStart()
    {
        startCounter++;
        if (startCounter == 1)
        {
            //start music here
        }

    public void OnStop()
    {
        startCounter--;
        if (startCounter == 0)
        {
            // stop music here
        }
    }

您可以嘗試使用AsyncPlayer,但您應該保留對該類的引用以停止播放聲音。

您可以使用Uri uri = Uri.parse("android.resource://com.stackoverlof.android/raw/ beep.mp3");創建本地資源的Uri uri = Uri.parse("android.resource://com.stackoverlof.android/raw/ beep.mp3"); .

希望這會有所幫助。

通過結合 Chad 和 Kedu 的答案並添加我自己的風格,我創建了這個可行的解決方案:

// Parent Activity which every Activity extends
public class ParentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Music.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
        Music.onStop();
    }
}
// Controller class for handling background music
public abstract class Music {

    private static MediaPlayer mediaPlayer;
    private static int startCounter = 0;

    public static void onStart() {
        startCounter++;
        if (startCounter == 1) {
            mediaPlayer = MediaPlayer.create(InitializeActivity.getContext(), R.raw.background_music);
            mediaPlayer.setLooping(true);
            mediaPlayer.setVolume(1f, 1f);
            mediaPlayer.start();
        }
    }

    public static void onStop() {
        startCounter--;
        if (startCounter == 0) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }
}

就是這樣,超級簡單!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM