質問

I want to play an audio file in the background of my app. Easy enough. I want the music to persist and NOT stop or pause while switching between activities in my app. Also fairly easy and accomplished simply by doing this in the onCreate method:

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ...
      mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity);
      mp.setLooping(true);
      mp.start();
    }

The problem? Getting the music to stop when I press the HOME button.

Killing the sound when the user presses the back button seems easy. Here's what I have for that and works great:

    public void onPause() {

      if(this.isFinishing()){  //BACK was pressed from this activity
        mp.stop();
      }

    super.onPause(); }

Not complicated, but this does not catch presses of the HOME button. If the Home button is pressed, the music keeps playing even while the user no longer sees my app.

I have seen answers that involve setting permission in the manifest to Get Tasks which I shouldn't have to do and appears dangerous to users. Besides that, the solution didn't even work. I've seen solutions that involve using a service, but none of those work either because the home button STILL plays the music just like before because there doesn't seem to be a way to catch it and it doesn't 'finish' the app (not to mention that every time someone suggest using a service for this task multiple people come in and state that this is not a proper use for services)

It seems the only way to kill the music when the Home button is pressed is to use a non-conditional stop() within onPause, but that's no good because that's called when I swap activities with intents, causing the music to end between activities which is no good.

I have trouble imagining that such a common function like background music is this hard, but I've seen post after post with the same issue as me and no proper answers other than ones that would kill the music between activities within the app.

How do all the other apps on the Google play store accomplish this and yet there appears to be no clear answer online? I could just stop and start the music with each onPause(), but that would cause unprofessional gaps in audio not to mention it would start the background audio from the beginning over and over again which is unacceptable.

役に立ちましたか?

解決

I'm a bit new to Android Programming (few months) and today, I faced the same problem you did (maybe you still do?)

I made it work as the following :

Lets say I have MainActivity, and in MainActivity I have Btn2 which leads to SecondActivity, and Btn3 which leads to ThirdActivity.

I declared at the beginning of MainActivity :

public static boolean shouldPlay = false;

I then implemented my onStop() method :

public void onStop() {
    super.onStop();
    if (!shouldPlay) { // it won't pause music if shouldPlay is true
        player.pause();
        player = null;
    }
}

If the boolean shouldPlay is set to true, then my onStop() won't be called entirely and my music won't turn off. I then have to decide when I set it to true. When I switch from MainActivity to SecondActivity, I do it through an Intent and that's when I'll set shouldPlay to true :

Button Btn2 = (Button) findViewById(R.id.Btn2);
    Btn2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            shouldPlay = true;
            startActivity(intent);
        }
    });

And the same is done for Btn3.

Now, the last thing we want to be looking for is that if I was to go back to MainActivity after visiting SecondActivity or ThirdActivity, shouldPlay would then have been set to true. The first thing I tried was to set it to false as soon as Second and ThirdActivity are called (in their onCreate()) but it want to work, maybe because the onStop() from Main and onCreate() from others are called simultaneously (frankly I don't really get life cycle for now). What worked is simply to set shouldPlay to false every time we launch onCreate() of Main :

shouldPlay = false;

This works properly for me. Let me know if it does for you, Cheers, bRo.

他のヒント

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_HOME){
        Log.d("Jorgesys", "Home button pressed!!!");
    }
    return super.onKeyDown(keyCode, event);
}

but hey! This no longer works as of 4.0 + , Read this: Capture Home Key Event

Try with Back button:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        Log.d("Jorgesys", "Back button pressed!!!");
    }
    return super.onKeyDown(keyCode, event);
}

To stop the media player, you are using the method:

isFinishing(): if the activity is finishing, returns true; else returns false, but you are only pausing the activity not finishing the activity.

public void onPause() {
      if(this.isFinishing()){  //INCORRECT, Here you are pausing you activity not finishing.
        mp.stop();
      }
    super.onPause(); 
}

so change to:

public void onPause() {
    if(mp.isPlaying())
      {
       mp.stop();
      }
    super.onPause(); 
}

When your activity is on pause, evaluates if your MediaPlayer is playing, if this is true then stops the audio.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top