Android上的媒体播放器会同时停止播放声音

Android上的媒体播放器会同时停止播放声音,android,audio,media-player,Android,Audio,Media Player,我看过很多关于它的帖子,很早就停止了声音。这不是我的问题。我的问题是。。。我有这25个声音,正在工作。当手机被摇晃时,它会说话,显示文本,并有一个动画,使人看起来像是在说话。一开始它工作得很好。我能够重现我的客户发现的问题的唯一方法是多次摇晃它,然后单击“上一步”。摇回它并多次摇动,然后再次单击“上一步”。当我再次摇回它几次时,它工作了,然后突然所有的声音都消失了。偶尔一个会工作,但如果再回来,回到它通常停止发出声音一起。其他一切都正常运转。以前有人遇到过这种情况吗?任何帮助都将不胜感激 pub

我看过很多关于它的帖子,很早就停止了声音。这不是我的问题。我的问题是。。。我有这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();
  }
}


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

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


Shash

好的,在评论中要发布的内容有点多,下面是您需要对setDataSource()执行的操作。如果您检查,您将看到它需要一个
文件描述符
。您可以为原始资源获取一个,如下所示:

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

Nah MediaPlayer正在onCreate中创建,声音的分配在onShake中。因此,如果我在顶部的onShake中放置sound0.stop()等,可能会解决问题?停止并释放MediaPlayer当您调用
sound0.reset()
时,您应该调用
sound0.release()
。或者(这是我的首选),使用
sound0.setDataSource()
而不是
sound0=MediaPlayer.create()
,并保持
reset()
调用不变。这将使MediaPlayer保持实例化状态,但更改声音并准备再次播放。@kcoppock Ok,因此我尝试了该版本,但问题仍然存在。对于sound0.setDataSource(),如何调用该文件?sound0.setDataSource(R.raw.咳嗽);不起作用,我不知道还有什么可以放在里面;评论太多,无法容纳。感谢您花时间这么做。我试试看,我一定是做错了什么。我在每个if(randomAnswer==)部分都输入了这个,没有声音发生。这一定是我初始化mp的方式。它以高于静止状态的方式初始化。我应该如何初始化它?对MediaPlayer不是很有经验。谢谢您的帮助。我们只需初始化一个,以
MediaPlayer mp=new MediaPlayer()
开头。然后,它应该处于接受数据源的状态。我强烈建议您仔细阅读以下链接。如果你真的能理解这一点,那么你遇到的整个问题对你来说就会更有意义:多谢了,我会仔细考虑的。