20

私はAndroidが初めてなので、問題があります。Android では、音楽プレーヤーが起動するとすぐにバックグラウンド ミュージックを再生し、アクティビティが変化しても継続させたいと考えています。私はこのコードを試しました:

MediaPlayer music = MediaPlayer.create(MainActivity.this, R.drawable.bgscore);
music.start();

ただし、ユーザーがアプリを閉じると音は止まるはずですが、そうではありません。どうすればこれを達成できますか?

4

10 に答える 10

9

複数の条件を処理するための別のクラスを作成する

import android.content.Context;
import android.media.MediaPlayer;
import android.util.Log;

public class MusicManager {
    static final int MUSIC_PREVIOUS = -1;
    private static final String TAG = "MusicManager";
    static MediaPlayer mp;
    private static int currentMusic = -1;
    private static int previousMusic = -1;


    public static void start(Context context, int music) {
        start(context, music, false);
    }

    public static void start(Context context, int music, boolean force) {
        if (!force && currentMusic > -1) {
// already playing some music and not forced to change
            return;
        }

        if (music == MUSIC_PREVIOUS) {
            Log.d(TAG, "Using previous music [" + previousMusic + "]");
            music = previousMusic;
        }
        if (currentMusic == music) {
// already playing this music
            return;
        }
        if (currentMusic != -1) {
            previousMusic = currentMusic;
            Log.d(TAG, "Previous music was [" + previousMusic + "]");
// playing some other music, pause it and change
            pause();
        }
        currentMusic = music;
        Log.d(TAG, "Current music is now [" + currentMusic + "]");
        if (mp != null) {
            if (!mp.isPlaying()) {
                mp.start();
            }
        } else {
            mp = MediaPlayer.create(context, R.raw.backGroundMusic); //Ur BackGround Music
        }

        if (mp == null) {
            Log.e(TAG, "player was not created successfully");
        } else {
            try {
                mp.setLooping(true);
                mp.start();
            } catch (Exception e) {
                Log.e(TAG, e.getMessage(), e);
            }
        }
    }

    public static void pause() {
        if (mp != null) {
            if (mp.isPlaying()) {
                mp.pause();
            }
        }

// previousMusic should always be something valid
        if (currentMusic != -1) {
            {
                previousMusic = currentMusic;
                Log.d(TAG, "Previous music was [" + previousMusic + "]");
            }
            currentMusic = -1;
            Log.d(TAG, "Current music is now [" + currentMusic + "]");
        }
    }

    public static void release() {
        Log.d(TAG, "Releasing media players");
        try {
            if (mp != null) {
                if (mp.isPlaying()) {
                    mp.stop();
                }
                mp.release();
            }
        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
        }

        if (currentMusic != -1) {
            previousMusic = currentMusic;
            Log.d(TAG, "Previous music was [" + previousMusic + "]");
        }
        currentMusic = -1;
        Log.d(TAG, "Current music is now [" + currentMusic + "]");
    }
}

次にMainActivity、グローバルブール変数を定義し、それをtruesetContentView(....) の前にonCreate()設定します

    boolean continueBGMusic;
    ....
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        continueBGMusic=true;
    setContentView(R.layout.activity_main);
    .....
    }

次に、次のように更新onPause()します

    public void onPause()
        {
            super.onPause();
            if(!continueBGMusic)
                MusicManager.pause();
    }

そしてonResume()_

    public void onResume()
        {
            super.onResume();

                continueBGMusic=false;
                MusicManager.start(this,R.raw.backGroundMusic);
    }

ブール変数と 2 つのメソッドを使用して、3 つのアクティビティすべてを更新します。

于 2013-09-18T12:48:51.163 に答える
4

アクティビティがあまりない場合は、音楽を再生するアクティビティにブール値フラグを追加することで、このタスクを管理できます。
1 つのアクティビティを停止すると、これらのフラグが表示され、他のアクティビティが MediaPlayer を必要とするかどうかが示されます。

したがって、メインのアクティビティでは次のようになります。

public class MainActivity extends Activity {

    static MediaPlayer introPlayer;
    static boolean sActive;

    @Override
    protected void onResume() {

    // starting the player if it is not playing
        if (!introPlayer.isPlaying()) {
            introPlayer.start();
            introPlayer.setLooping(true);
        }

        // true when activity is active
        sActive = true;
        super.onResume();
    }

    @Override
    protected void onPause() {

        sActive = false;
        super.onPause();
    }

    @Override
    protected void onStop() {

        // before stoping mediaplayer checking whether it is not used by other          activities

        if (introPlayer.isPlaying()
                && !(Activity2.sActive || Activity3.sActive)) {
            introPlayer.pause();
        }

        super.onStop();

    }
}

他のアクティビティー:

public class Activity2 extends Activity {

    static boolean sActive;

    @Override
    protected void onPause() {
        sActive = false;

        super.onPause();
    }

    @Override
    protected void onStop() {

        // pausing the player in case of exiting from the app
        if (MainActivity.introPlayer.isPlaying() && !(MainActivity.sActive || Activity3.sActive)) {
            MainActivity.introPlayer.pause();
        }

        super.onStop();
    }

    @Override
    protected void onResume() {
        sActive = true;

        if (!MainActivity.introPlayer.isPlaying()) {
            MainActivity.introPlayer.start();
            MainActivity.introPlayer.setLooping(true);
        }

        super.onResume();
        }
}

public class Activity3 extends Activity {

    static boolean sActive;

    @Override
    protected void onPause() {
        sActive = false;

        super.onPause();
    }

    @Override
    protected void onStop() {

        // pausing the player in case of exiting from the app
        if (MainActivity.introPlayer.isPlaying() && !(MainActivity.sActive || Activity2.sActive)) {
            MainActivity.introPlayer.pause();
        }

        super.onStop();
    }

    @Override
    protected void onResume() {
        sActive = true;

        if (!MainActivity.introPlayer.isPlaying()) {
            MainActivity.introPlayer.start();
            MainActivity.introPlayer.setLooping(true);
        }

        super.onResume();
        }
}
于 2015-05-28T23:25:25.687 に答える
2

これを試して

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        music.stop();
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

それ以外の場合は、アプリを閉じるための別のボタン アクションがある場合は、music.stop(); として呼び出すことができます。

于 2013-09-18T11:44:19.343 に答える
0

非常に単純なのは、MediaPlayer の音量をオフにしたい場合です。setVolume(int leftVolume, int RightVolume) で設定してみてください。

したがって、MediaPlayer のボリュームをオフにしたいときはいつでも。使用する

music.setVolume(0,0);

MediaPlayer を停止して一時停止することもできますmusic.pause();

そしてメディアプレーヤーを停止しますmusic.stop();

于 2015-11-04T11:15:57.880 に答える
0

@ ActivityLifecycleCallbacksを見て、アクティビティの開始と停止を追跡して、アプリがいつ「停止」したかを確認してください。これは、onActivityStopped への呼び出しが発生し、短い時間枠内で onActivityStarted への呼び出しが続かない場合です。

于 2015-11-04T15:20:00.687 に答える
0

私は次の方法でこれを行いました

初期化

    MediaPlayer player;
    Music music;

OnCreateで

    music = new Music();
    music.execute("abc");

音楽を止めたいとき、通常は onDestroy メソッドで

        music.cancel(true);
        if(player.isPlaying()){
        player.stop();
        player.release();
        }

音楽教室を作る

  public class Music extends AsyncTask<String, Integer, Void>
{

    @Override
    protected Void doInBackground(String... params) {

        if(running)
        {
        player = MediaPlayer.create(getApplicationContext(), R.raw.bg_music1); 
        player.setVolume(100,100); 
        player.setLooping(true); 
        player.start(); 
        }
        else
        {
            player.stop();
            player.release();
        }
        return null;
    }

    @Override
    protected void onCancelled() {
        // TODO Auto-generated method stub
        super.onCancelled();
        running = false;
    }
}

別の方法は、サービスを使用することです

于 2014-11-12T10:27:58.890 に答える
0

アプリケーションを終了するたびに、music.stop() を呼び出すだけです。onStop()アプリが 1 つのアクティビティのみで構成されている場合は、ランチャー アクティビティのメソッドでこれを行うことができます。

音を効率よく再生したい場合は、SoundPoolを使用することをお勧めします。それを使用すると、同時に多くのサウンドを再生できます。また、SoundPool のデモ プロジェクトも作成しました。ここで見つけることができます

MediaPlayer オブジェクトを使用する場合、すべてを自分で管理する必要があります。最初のゲームでも同じものを使用しました。しかし今、私の新しいゲームでは、SoundPool を使用しています。API 1 n still rocks で追加されました。

于 2013-09-18T11:51:31.567 に答える
0

音楽の再生を開始するには、アプリケーションの開始時刻を把握する必要があります。Applicationクラスを拡張することでそれを行うことができます。Application オブジェクトはアクティビティの前にインスタンス化され、アプリが Android OS によって終了されるまで保持されます。そのため、このオブジェクト内でのみ再生を制御するのが理想的です。Application を拡張する新しいクラスを作成するときは、それをマニフェストに登録する必要があります。

アプリケーションがいつ作成されるかを決定しましたが、アプリケーションがフォアグラウンドからバックグラウンドに移行するときに音楽を停止するにはどうすればよいでしょうか? Android には、それを判断するためのすぐに使える方法はありません。その問題を解決するために、私はこの非常に優れた記事に従いました。ソリューション コードの一部はそこからのものでした。

アプリケーションのコード:

package com.example.stackmusic; 

import android.app.Activity;
import android.app.Application;
import android.media.MediaPlayer;
import android.os.Bundle;


public class PlayMusicApp extends Application {


private MediaPlayer music;
@Override
public void onCreate() {
    super.onCreate();
    registerActivityLifecycleCallbacks(new MyLifecycleHandler());

    music = MediaPlayer.create(this, R.raw.some_music);
}

/**
 * All activities created in our application will call these methods on their respective
 * lifecycle methods.
 */
class MyLifecycleHandler implements ActivityLifecycleCallbacks {

    private int resumed;
    private int stopped;

    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    }

    public void onActivityDestroyed(Activity activity) {
    }

    public void onActivityResumed(Activity activity) {
        // this is the first activity created
        if(resumed == 0) {
            music.start();
        }
        ++resumed;
    }

    public void onActivityPaused(Activity activity) {
    }

    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    }

    public void onActivityStarted(Activity activity) {
    }

    public void onActivityStopped(Activity activity) {
        ++stopped;
        android.util.Log.w("test", "application is being backgrounded: " + (resumed == stopped));
        // we are stopping the last visible activity
        if(resumed == stopped) {
            music.stop();
        }
    }
  }
}

マニフェストへの登録:

<application
    android:name=".PlayMusicApp"

UI スレッドで音楽を再生したくありません。Application オブジェクトでメディア プレーヤーを管理するのではなく、バックグラウンド スレッドで音楽を再生するサービスを作成するのが理想的です。

于 2015-11-05T05:20:25.417 に答える
-1

最も簡単な解決策は、Android の設定 > アプリ > (音楽プレーヤーの名前) に移動し、[強制停止] をタップすることです。動作を確認すると、音楽が停止するはずです。すべての音楽プレーヤーで機能するとは限りませんが、試してみる価値はあります。

コードが必要な場合は、割り当ててみましたmusic.pause()か? このコマンドは音楽を停止します。

于 2015-11-05T03:42:48.830 に答える