31

こんにちは!ここスタックオーバーフローで初めて質問します。エキサイティング!ハハ。

Android ゲームを開発していて、イントロ用にバックグラウンド ミュージックを再生していますが (イントロ アクティビティがあります)、次のアクティビティまで再生を続けたいと考えています。応用。

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

4

6 に答える 6

9

次のように、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() {

    }
}
于 2010-06-12T12:35:37.563 に答える
6

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

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

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

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

アクティビティの onStop イベントで、keepMusicGoing が true かどうかを確認します。そうであれば、音楽をオンのままにし、keepMusicGoing を false に設定します。

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

私に電子メールを送ってください。私が書いた 2 つの SoundManager をお送りします。1 つは MediaPlayers を使用し、もう 1 つは SoundPools を使用します

チャド

于 2010-06-16T20:17:44.157 に答える
2

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

独自のクラス「SoundManager」を作成し、すべてのアクティビティ onStart および onStop からいくつかの onStart および onStop クラスを呼び出します (または基本アクティビティ クラスを使用します)。startCounter(onstart では startCounter++、onstop では startCounter--) を使用して、onStart と onStop を追跡します。新しいアクティビティの開始は古いアクティビティの 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
        }
    }
于 2015-07-20T10:24:06.537 に答える
2

あなたの状況を正しく理解していれば、同じ問題に何度か直面したことになります。アプリケーションで音楽を再生するために別のスレッドを使用しています。この実装は、音楽が再生されている間は有効であることがわかっている 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;
    }
    }
}
于 2010-06-10T18:18:28.823 に答える
1

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

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

お役に立てれば。

于 2010-06-10T20:48:44.950 に答える