tags:

views:

1098

answers:

3

Hi

I am using a MediaPlayer instance in order to stream audio files from an Internet location. The audio player is in a separate activity. The user can select from a list of audio files and come to this activity to play the audio.

Now the user might go back to the previous activity (with the list) and select another audio file. In this case, I want to stop any other audio that is playing and start playing the new audio which was selected.

Is there any way I can know whether an audio file is playing without having to hold on to the MediaPlayer object?

Thanks.

Edit

I did find out how to know whether an audio is playing. We can do it by using an object of AudioManager and calling isAudioPlaying(). This will return a true if any audio is playing.

Now the other question, how do I stop an audio currently playing? I do not have an instance of the MediaPlayer object which was created to start the audio (coz the user has already left the activity once and has come back with a new object of the activity and thus a new instance of the MediaPlayer)

+2  A: 

You'll need to call stop() on the MediaPlayer instance. To make this work in your application, you'll either need to:

  • Call stop() within the audio playing activity (in onDestroy()), for example
  • Create a Service to play audio, and communicate with it from both activities

Using a Service will allow your code to continue running outside of the Activity life-cycle, and is the only way to persist a MediaPlayer object like you need to in this case.

Alternatively, you may be able to create a custom subclass of Application and store the MediaPlayer there, but using a Service is considered better practice.

jargonjustin
Thanks. Would it be better to use a service, a static variable or a singleton class? What would be the better design option?
lostInTransit
A: 

Here's some handy code to sleep until audio is done playing:

   AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
   while(manager.isMusicActive())
    {
        Log.d("music", "music is active");
        try
        {
            Thread.sleep(500);
        }
        catch (InterruptedException e)
        {
            Log.e("music", "interrupted waiting for music to stop");
        }
        Log.d("music", "done playing music");
    }
gregm
+1  A: 

@lostintransit "Would it be better to use a service, a static variable or a singleton class? What would be the better design option?"

I think a service is what you want. The built-in media player and Pandora's app both use a service to ensure the music isn't tied to the Activity lifecycle.

If I'm understanding why you'd use a singleton or static I don't think it will accomplish what you want. The singleton/static will only be enforced within a single process in Linux. If you launch your Activity, then close it, then launch it again, they will run in different processes.