web-dev-qa-db-ja.com

Androidメディアプレーヤーはバックグラウンドで再生されますが、アプリが強制終了されても停止しません

私はAndroidを初めて使用するので、問題があります。 In Androidミュージックプレーヤーが起動したらすぐにバックグラウンドミュージックを再生し、アクティビティが変化してもバックグラウンドミュージックを継続したい。次のコードを試しました。

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

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

19

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

_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でグローバルブール変数を定義し、onCreate()のsetContentView(....)の前にtrueに設定します。

_    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() as

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

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

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

8
Bhavna

これを試して

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

    return super.onKeyDown(keyCode, event);
}

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

3
Siva K

アクティビティがあまりない場合は、音楽を再生するアクティビティにブールフラグを追加することで、このタスクを管理できます。
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();
        }
}
3
user4702646

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

したがって、MediaPlayerの音量をオフにしたいときはいつでも。使用する

_music.setVolume(0,0);
_

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

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

0
Pranav Patel

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

初期化

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

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

0
Sumit

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

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

0
user5487924

曲を停止するには、Destroyでmusic.stop()を実行します。アプリを閉じるか強制終了すると音楽が停止することを意味します

@Override
protected void onDestroy() {
    music.stop();
    super.onDestroy();
}
0

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

アプリケーションがいつ作成されるかを決定しましたが、アプリケーションがフォアグラウンドからバックグラウンドに移行したときに音楽を停止するのはどうでしょうか。 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スレッドで音楽を再生したくない。理想的には、アプリケーションオブジェクトでメディアプレーヤーを管理するのではなく、バックグラウンドスレッドで音楽を再生するためのサービスを作成します。

0
rodjo2u

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

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

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

0
Jatin Malwal

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

0
Pepijn