Media Player на Android останавливает звуки все вместе - PullRequest
0 голосов
/ 09 августа 2011

Я видел много постов о том, что звук остановился рано. Это не моя проблема. Моя проблема в том, что у меня есть эти 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 ]

1 голос
/ 10 августа 2011

Хорошо, это немного для публикации в комментариях, так что вот что вам нужно сделать с setDataSource ().Если вы проверите документы для setDataSource () , вы увидите, что для этого требуется FileDescriptor.Вы можете приобрести его для ресурса Raw следующим образом:

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();
0 голосов
/ 09 августа 2011

Из вашего кода похоже, что вы создаете MediaPlayer по клику.Но я не вижу никакого кода, чтобы остановить / выпустить его.Таким образом, ваше приложение может исчерпать ресурсы, в конечном итоге остановив дополнительный контент медиаплеера.Вот почему после пары событий встряхивания эта проблема продолжает расти.

Shash

...