Кнопка остановки и воспроизведения для аудио (Android) - PullRequest
1 голос
/ 22 апреля 2010

У меня есть эта проблема, у меня есть звук, который я хочу воспроизвести ...

И у меня для этого есть две кнопки: «Играть» и «Стоп» ...

Проблема в том, что после того, как я нажимаю кнопку остановки, а затем нажимаю кнопку воспроизведения, ничего не происходит. - Кнопка остановки останавливает песню, но я хочу, чтобы кнопка «Воспроизведение» снова воспроизводила песню (с самого начала). Вот мой код:

final MediaPlayer mp = MediaPlayer.create(this, R.raw.megadeth);

А потом два публичных клика:

(Для игры ...)

 button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click
             button.setText("Playing!");
             try {
     mp.prepare();
    } catch (IllegalStateException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
             mp.start();
             //
            }
        });

И для остановки трека ...

    final Button button2 = (Button) findViewById(R.id.cancel);
    button2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

         mp.stop();
         mp.reset();

        }
    });

Кто-нибудь может увидеть проблему с этим? Если это так, не могли бы вы исправить это ... (для предложения)

Большое спасибо ...

Джеймс

Ответы [ 3 ]

1 голос
/ 08 октября 2010

В документации Android есть ошибка, на этой странице сказано, что вы можете stop() медиаплеер с «необработанным ресурсом», а затем воспроизвести его, просто вызвав reset() и * 1005. * прежде чем позвонить start() снова. Это не работает, как вы заметили.

Проблема в том, что reset() очищает источник звука и возвращает его в исходное состояние, поэтому вы должны снова установить источник данных. К сожалению, вы не можете установить источник данных «необработанных ресурсов», потому что для этого нет API, кроме create().

Я не знаю чистого способа решения этой проблемы. Путь stealthcopter прекрасно работает, но это боль для вашего дизайна, так как вам нужен контекст для каждого вызова start () :( И включает в себя уничтожение и создание сложного объекта, который имеет цену для приложений реального времени, таких как игры ...

Другой способ, который гарантирует, что контекст будет необходим только для вызова create (), - это остановить медиаплеер следующим образом:

stop()
prepare()

но если вы вызовете start () сейчас, он не будет перезапущен с самого начала. Вы можете позвонить seekTo(0), но в этом звуке будет немного шума с предыдущей позиции воспроизведения.

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

1 голос
/ 22 апреля 2010

Вам необходимо позвонить prepare() или preparAsync() до start().

Подробнее см. API (см. Диаграмму состояний).

0 голосов
/ 23 апреля 2010

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

Создание:

    public MediaPlayer mp=null;

Начало:

    if (mp!=null){ 
            mp.reset();
            mp.release();
    }
            mp = MediaPlayer.create(test.this, soundResource);
            mp.start();

Остановка:

        mp.stop();

Также обратите внимание, что вам не нужно использовать метод prepare, потому что метод create уже вызывает приготовление ( API REF ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...