Android上的Media Player会一起停止声音

时间:2011-08-09 17:31:12

标签: android audio media-player

我见过很多关于它早早停止声音的帖子。这不是我的问题。我的问题是这个...我有这25个声音起作用。当电话被摇动时,它会说话,显示文本,并且有一个动画,所以这个人看起来像是在说话。它起初工作得很好。我能够重现我的客户发现的问题的唯一方法是多次摇动,然后点击返回。摇晃回来并摇晃很多次,然后再次点击回来。当我再次摇回它几次然后工作突然所有声音切断。偶尔会有一个可以工作,但如果再次返回并且重新进入它通常会停止发出声音。其他所有功能都应该如此。以前遇到过这个人吗?任何帮助将不胜感激。

public class Ask extends Activity{
private SensorManager mSensorManager;
 private ShakeEventListener mSensorListener;
 String[] answer;
 int possibleAnswers, randomAnswer, talkRun=0, last=-1;
 int shake0;
 long lastClick;
 private MediaPlayer mp, sound0;
Context context;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ask);
        Intent type = getIntent();
        lastClick = type.getLongExtra("lastClick", 0);
        context=this;

        final Random generator = new Random();

        possibleAnswers = 1;
        answer = new String[possibleAnswers];
        answer[0]="***Coughing***";



        //Sounds
        setVolumeControlStream(AudioManager.STREAM_MUSIC); 
        mp = MediaPlayer.create(this, R.raw.askbud);
        mp.start();


        mSensorListener = new ShakeEventListener();
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSensorManager.registerListener(mSensorListener,
            mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_UI);

      final TextView tv = (TextView)findViewById(R.id.answer);


        mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() {

          public void onShake() {
              if (System.currentTimeMillis() - lastClick > 900) {
                  lastClick = System.currentTimeMillis();



                      randomAnswer = generator.nextInt(possibleAnswers);
                      if(last==randomAnswer)
                          randomAnswer = generator.nextInt(possibleAnswers);

                      animation();

                      if(randomAnswer==0){
                        if(shake0>=1){
                            sound0.reset();
                        }
                        shake0++;
                        sound0 = MediaPlayer.create(context, R.raw.coughing);
                        try {
                            sound0.prepare();
                        } catch (IllegalStateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        sound0.start();
                      }

        });
    }





 @Override
  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(mSensorListener,
        mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
        SensorManager.SENSOR_DELAY_UI);
  }

  @Override
  protected void onStop() {
    mSensorManager.unregisterListener(mSensorListener);
    super.onStop();
  }

}

只是对问题的一点点补充。在我听到没有声音后,即使应用程序关闭并重新打开,它仍会继续发生。

2 个答案:

答案 0 :(得分:1)

好的,这在评论中发布有点多,所以这就是你需要用setDataSource()做的事情。如果您查看docs for setDataSource(),则会看到它需要FileDescriptor。您可以为原始资源获取一个,如下所示:

Resources res = getResources();
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.coughing);
FileDescriptor fd = afd.getFileDescriptor();

//assuming existing MediaPlayer mp
mp.reset();
mp.setDataSource(fd);
mp.prepare();
mp.start();

答案 1 :(得分:0)

从您的代码中,您似乎在点击时创建了MediaPlayer。但我没有看到任何代码来停止/释放它。因此,您的应用程序可能会耗尽资源,最终会停止其他媒体播放器内容。这就是为什么在经历了几次震动之后,这个问题正在得到支撑。

词shash