Android - Как разрешить воспроизведение только одного экземпляра MediaPlayer одновременно? - PullRequest
4 голосов
/ 20 марта 2011

Я пытаюсь создать простое Android-приложение Sound-board, используя элементы ListView в качестве кнопок. (Кстати, я начинающий программист)

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

В настоящее время звуки воспроизводятся без остановки каких-либо воспроизводимых в данный момент звуков, поэтому, если я нажимаю на спам кнопки, одновременно воспроизводится несколько звуков (и если я нажимаю слишком много одновременно, приложение закрывается).

Я пробовал использовать несколько вариантов:

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

Но в соответствии с тем, что я прочитал в нескольких других источниках, я создаю несколько экземпляров класса MediaPlayer, и хотя они и имеют одинаковые имена, метод stop () пытается остановиться на последнем экземпляре mp (в некоторых случаи, это даже не создано).

Я предполагаю, что моя общая реализация класса MediaPlayer неверна, но это лучшее, что я мог придумать.

В любом случае, вот соответствующий блок кода:

public class soundTest extends Activity {
  private ListView lv1;
  private String lv_arr[]={"test 1","test 2","test 3","test 4","test 5"};

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    lv1=(ListView)findViewById(R.id.ListView01);
    lv1.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item, lv_arr));

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

        if (lv1.getItemAtPosition(position)=="test 1") {
          MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.sound1);
          mp.start();
          mp.setOnCompletionListener(new OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
              mp.release();
            }
          });
        }

        if (lv1.getItemAtPosition(position)=="test 2") {
          MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.sound2);
          mp.start();
          mp.setOnCompletionListener(new OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
              mp.release();
            }
          });
        }

        //And the rest of the sounds 3,4,5.

      }
    });
  }
}

Любая помощь будет оценена, спасибо.

Редактировать (22 марта):

Я нашел следующий фрагмент кода, который должен работать:

mp.setDataSource(context, Uri.parse("android.resource://" + Config.PACKAGE + "/" + resId));

Но я не могу понять, как работает часть "Config.PACKAGE". Я просто получаю сообщение об ошибке «ПАКЕТ не может быть разрешен или не является полем».

Я попытался заменить "ПАКЕТ" на имя пакета, та же ошибка. Я также попробовал:

try {
  mp.setDataSource(getApplicationContext(),Uri.parse("android.resource://com.mptest/" + R.raw.test2));
} catch (IOException e) {
  e.printStackTrace();
}

Но я не могу работать, что именно поставить вместо "//com.mptest/".

Ответы [ 5 ]

3 голосов
/ 06 декабря 2012

Глобальная переменная MediaPlayer должна быть установлена ​​private static. Это поймало меня несколько раз.

2 голосов
/ 28 июня 2011

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

Существует множество хороших примеров кода Java для этого шаблона, начиная с http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.htmlи ты не ошибешься.

1 голос
/ 20 марта 2011

Подумайте о том, чтобы сохранить ваш MediaPlayer как глобальную переменную вместо нескольких его экземпляров.

0 голосов
/ 14 октября 2015

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

0 голосов
/ 21 марта 2011

Вы можете найти хорошую ссылку в VideoView Source , так как он обрабатывает один MediaPlayer объект, и вы можете изменять содержимое во время воспроизведения.

...