web-dev-qa-db-ja.com

Androidでのアクティビティ間のBG音楽の再生

こんにちは!ここで初めてstackoverflowで質問します。わくわくします!はは。

Androidゲームを開発しており、イントロのバックグラウンドミュージックを再生します(イントロアクティビティがあります)が、次のアクティビティまで再生し続け、停止できるようにする必要があります。または、アプリケーション内のどこからでも音楽を再生します。

現在行っているのは、イントロアクティビティでMediaPlayerを使用してbgmを再生することです。ただし、ユーザーがアクティビティを終了するとすぐに音楽を停止します。これにはサービスのようなものを使用する必要がありますか?またはMediaPlayer/SoundPoolで十分ですか?だれかが答えを知っている場合は、私たちと共有していただければ幸いです。ありがとう!

31
jhie

以下のように、mediaplayerを使用して音楽を再生するサービスを作成することもできます。

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

    }
}
9
Maneesh

SoundPoolsまたはMediaPlayersを使用して静的なSoundManagerを作成します。

KeepMusicGoingという静的フラグを作成します。

最初のアクティビティが作成されたときに音楽を開始します。

アクティビティを切り替えるときは、keepMusicGoingをtrueに設定します。

アクティビティのonStopイベントで、keepMusicGoingがtrueかどうかを確認し、trueの場合は音楽をオンのままにしてから、keepMusicGoingをfalseに設定します。

ホームボタンを押すと、keepMusicGoingフラグがfalseになり、アクティビティがフォーカスを失ったときに音楽が停止します。

私にメールしてください。私が書いたいくつかのSoundManagerを送信できます。1つはMediaPlayersを使用し、もう1つはSoundPoolsを使用します。

チャド

6
Chad

私があなたの状況を正しく理解していれば、同じ問題に何度か直面しています。アプリケーションで音楽を再生するために別のスレッドを使用しています。この実装は、音楽の再生中は存続することがわかっているコンテキストへの静的参照を渡します。

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;
    }
    }
}
2
Shade

AsyncPlayer を使用してみることができますが、サウンドの再生を停止するには、クラスへの参照を保持する必要があります。

Uri uri = Uri.parse("Android.resource://com.stackoverlof.Android/raw/ beep.mp3");を使用して、ローカルリソースへのUriを作成できます。

お役に立てれば。

1

まず、チャドから提供された「keepMusicPlaying」フラグを保持する方法を使用しました。アクティビティのonStartメソッドとonStopメソッドを使用する方がエレガントだと思います。

独自のクラス「SoundManager」を作成し、すべてのアクティビティonStartおよびonStopからいくつかのonStartおよびonStopクラスを呼び出します(または基本アクティビティクラスを使用します)。 startCounterを使用してonStartおよびonStopを追跡します(onstartのstartCounter ++およびonstopのstartCounter--)。新しいアクティビティの開始は古いアクティビティのonStopの前に呼び出されるため、onStartが初めて呼び出された(startCounter == 1)か、別のアクティビティから開始された(startCounter == 2)かは常にわかります。 onStopeと同じです(startCounter == 0はアプリが閉じられたことを意味し、startCounter == 1は古いアクティビティからの停止を意味しますが、新しいアクティビティがあります)。

このようにして、アプリ内のすべてのアクティビティの開始時にkeepMusicPlayingメソッド/フラグを呼び出す必要がなく、すべてをSoundManagerにカプセル化します。

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

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