活动结束后播放声音

时间:2013-10-22 18:42:09

标签: android android-activity

我使用媒体播放器在我的应用程序上播放声音。它运作得很好。

我在分离的线程上播放声音。甚至想到,在活动出现之前,部分声音会播放。

  

我尝试在onCreate方法上播放声音。它不起作用。 onStart和   的onResume。它有一些问题。它每次恢复活动时都会播放。   有时我甚至没有触摸设备!

活动出现后播放声音的最佳方式是什么?

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

1 个答案:

答案 0 :(得分:1)

您的played变量仅在活动有效时才有效。如果它被杀死,played不会保留。例如,旋转设备,您将再次听到声音播放。

  • 在onSavedInstanceState包中保存状态(已播放)并在onCreate中恢复
  • 在OnCreate或onResume中播放