2016-08-11 1 views
0

Поэтому я помещаю аудиофайл в свое приложение, и это supposted играет, когда я касаюсь кнопки и останавливаюсь, когда снова касаюсь ее.Аудиофайл в приложении не останавливается на клике, он снова начинает воспроизводиться

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    Button one = (Button) findViewById(R.id.buttonId); 
    final MediaPlayer mp = new MediaPlayer(); 

    one.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v) { 
      if(mp.isPlaying()) 
      { 
       mp.stop(); 
      } 

      try { 
       mp.reset(); 
       AssetFileDescriptor afd; 
       afd = getAssets().openFd("mosq.mp3"); 
       mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
       mp.prepare(); 
       mp.setLooping(true); 
       mp.start(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 


}); 

вот мой код, эта часть:

if(mp.isPlaying()) 
     { 
      mp.stop(); 
     } 

не работает по какой-то причине.

+0

У вас есть еще несколько ошибок, кроме того, см. Мой ответ. – EJoshuaS

ответ

2

Обязательно поставьте оператор return ниже mp.stop().

Из того, что я могу понять, звук делает остановки, но затем он начинает снова, потому что следующая часть кода по-прежнему запускается на выполнение

+0

Или положите логику «start» в выражении «else». – EJoshuaS

+0

'if (mp.isPlaying()) { mp.stop(); возвращение; } ' работал отлично, спасибо! –

0

Как Джордж D правильно указал, вы начинаете СМИ играть безоговорочно, даже если вы просто остановил его. Вы можете использовать свое решение или сделать что-то вроде:

if(mp.isPlaying()) 
     { 
      mp.stop(); 
     } 
     else { 
      try { 
      mp.reset(); 
      AssetFileDescriptor afd; 
      afd = getAssets().openFd("mosq.mp3"); 
      mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
      mp.prepare(); 
      mp.setLooping(true); 
      mp.start(); 
      } catch (IllegalStateException e) { 
      e.printStackTrace(); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
     } 

Это имеет несколько других возможных ошибок в нем:
* Я не уверен, если это то, что вы хотели, но игрок не будет когда-либо паузы, просто остановить и перезапустить с самого начала. Если вы попытаетесь возобновить или воспроизвести снова, он будет полностью перезагружать аудиофайл каждый раз. Как минимум, это пустая трата ресурсов, и, скорее всего, это не ожидаемое поведение с точки зрения пользовательского интерфейса.
* Вы не хотите определять объект MediaPlayer как локальную переменную в методе OnCreate. Единственная причина, по которой это работает вообще, - это утечка памяти (вы никогда не отписываете обработчик событий для клика); если бы у вас не было утечки памяти, объект стал бы подходящим для сбора мусора, как только вы завершили метод onCreate, и, что касается структуры, он больше не будет существовать.

+0

'Я не уверен, что это то, что вы намеревались, но игрок никогда не останавливается, просто остановитесь и перезапустите с самого начала. Это именно то, что я хотел сделать. не могли бы вы объяснить, что утечка памяти пожалуйста? –