Остановка воспроизведения MP на Touch / Click в расширенном ListActivity - PullRequest
0 голосов
/ 04 июня 2011

Я отображаю ListView файлов для воспроизведения, считанных из массива в Strings.xml.

Все работает нормально, однако я не могу понять, как реализовать Событие, которое остановит воспроизведение при нажатии или прикосновении в любом месте экрана, чтобы можно было прервать воспроизведение аудиофайла и не нужно ждать, пока весь файл играется.

Пожалуйста, сообщите.

public class ViewSounds extends ListActivity {

MediaPlayer mp;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setVolumeControlStream(AudioManager.STREAM_MUSIC);

// Get Button Labels
String[] lex_names = getResources().getStringArray(R.array.lex_names);

// Get File Names
final String[] lex_files = getResources().getStringArray(R.array.lex_files);

setListAdapter(new ArrayAdapter<String>(this, R.layout.list_sounds, lex_names));

final ListView lv = getListView();
lv.setTextFilterEnabled(true);

lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id)     {      

  final int playFile = getResources().getIdentifier(lex_files[position], "raw", getPackageName());

  mp = MediaPlayer.create(getApplicationContext(), playFile);
  mp.start();

  while (mp.isPlaying()) { 
    // ...        
  };

  mp.release();             
  }

 });      

}  
}

1 Ответ

0 голосов
/ 04 июня 2011

Вместо воспроизведения мультимедиа в onItemClick() создайте AsyncTask, чтобы запустить его в фоновом режиме, а затем пометьте фоновый поток, чтобы остановить, когда пользователь указывает, что он хочет прекратить (нажав кнопку скажем). В качестве альтернативы управляйте плеером через Службу и звоните, чтобы остановить / запустить проигрывателя через это, поскольку вы действительно не хотите, чтобы проигрыватель работал в потоке пользовательского интерфейса.

Вот пример использования AsyncTask, который останавливает воспроизведение, когда пользователь нажимает кнопку (R.id.stop_playing):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final MediaPlayerAsyncTask player = new MediaPlayerAsyncTask(R.raw.my_media);
    Button stopPlaying = (Button) findViewById(R.id.stop_playing);
    stopPlaying.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            player.stopPlayer();
        }
    });
    setVolumeControlStream(AudioManager.STREAM_MUSIC);
    player.execute((Void []) null);

}

private class MediaPlayerAsyncTask extends AsyncTask<Void, Void, Void> {
    private boolean stopPlayer;
    MediaPlayer mp;

    MediaPlayerAsyncTask(int playFile) {
        mp = MediaPlayer.create(TestStuff.this, playFile);
    }

    @Override
    protected Void doInBackground(Void... params) {
        stopPlayer = false;
        mp.start();

        while (!stopPlayer && mp.isPlaying()) {
            SystemClock.sleep(1000);
        }
        mp.stop();
        return null;
    }

    public void stopPlayer() {
        stopPlayer = true;
    }

}
...