hasan
hasan

Reputation: 24205

Play Sound on after activity appears

I use media player to play sounds on my application. It works just fine.

I am playing sound on a separated thread. Even thought, part of the sound plays before activity appear.

I tried to play sound onCreate method. it didn't work. onStart and onResume. it has some problems. it plays every time activity resumed. sometimes while I am not even touching the device!

What is the best way to play sound after activity appears?

public boolean played = false;
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if (!played)
        Settings.playSound(dvd.titleImageName.replace("png", "mp3"), this);
    played = true;
}

public static MediaPlayer mp = null;
public static void playSound(String fileName, Context c)
{
    //MediaPlayer mp = MediaPlayer.create(c, resId);
    if (mp!=null)
    {
        mp.stop(); //error
        mp.reset();
        mp.release();
    }

    mp = new MediaPlayer();

    AssetFileDescriptor descriptor;
    try {
        descriptor = c.getResources().getAssets().openFd("sounds/" + fileName);
        mp.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
        descriptor.close();
        mp.prepare();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if (mp == null) return;
    mp.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {

        }
    });

    mp.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {
            // TODO Auto-generated method stub

        }
    });

    mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {

        @Override
        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
            // TODO Auto-generated method stub

        }
    });

    new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            mp.start();
        }
    }).start();
}

Upvotes: 0

Views: 327

Answers (1)

Eugene
Eugene

Reputation: 656

Your played variable only works while activity is alive. If it gets killed, played doesn't retain. For example, rotate your device an you'll hear sound playing again.

  • save state (played) in onSavedInstanceState bundle and restore it in onCreate
  • Play in in OnCreate or onResume

Upvotes: 1

Related Questions