Звук продолжает играть после закрытия - PullRequest
7 голосов
/ 03 июля 2011

Прежде всего, спасибо за этот замечательный сайт, я нашел много информации, просматривая ответы на вопросы здесь.У меня проблема, однако, что я нашел только одно упоминание (без ответа).

Я пишу приложение, которое использует AudioTrack для зацикливания синусоиды, генерируемой во время выполнения, через разъем для наушников (для управления другой электроникой).).Он делает это через определенные промежутки времени (используя Handler.postDelayed) и работает просто отлично - за исключением случаев, когда вам приходится принудительно закрывать приложение.В этом случае синусоида продолжает воспроизводиться даже после того, как само приложение давно исчезло, и буквально единственное, что я могу сделать, чтобы остановить его, это перезагрузить телефон.

Звук останавливается, как и должно быть, еслиприложение закрывается должным образом, и даже в случае сбоя.

Я пытался:

  • создать метод onDestroy () для остановки и освобождения экземпляра AudioTrack, но, к сожалению, это не такt даже вызывается.
  • с использованием большего звукового буфера для звукового цикла (надеясь, что маленький размер буфера вызвал ошибку);без разницы.
  • снова запускаю мое приложение: теперь у меня две волнующие синусоиды!
  • полностью (!) удаляю приложение! Синусоида все еще существует, чтобы преследовать меня из-за могилы.
  • перевод телефона в беззвучный режим: без разницы.(Я не хочу, чтобы это происходило с моими пользователями.)
  • Полное уменьшение громкости носителя и ожидание 15+ минут: без разницы.
  • изменение частоты дискретизации до 11, 22 или 44,1 кГц: без разницы.
  • запуск и уничтожение приложения снова и снова: я мог фактически получить 8 различных бессмертных синусоидальных волн, мешающих друг другу таким образом.Довольно круто на самом деле.: P

Я знаю, что использовать «убийцы задач» на Android нецелесообразно, но многие до сих пор так делают, и я не хочу, чтобы телефоны моих пользователей становились неостановимыми генераторами шума в случае, еслимое приложение зависает, и его задница задыхается.

Вот код, который генерирует синусоидальную волну:

int bufSize = (int)(11025.0 / 60.0); // the number of samples needed for a seamless loop at 60Hz
AT = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_8BIT, bufSize, AudioTrack.MODE_STATIC);

byte buffer[] = new byte[bufSize];

float angle = 0.0f;
for (int i=0; i < bufSize; i++){
    buffer[i] = (byte)(Math.sin(angle) * 255);
    angle += (float)(2*Math.PI) * 60 / 11025;
}

if (AT.write(buffer, 0, bufSize) != bufSize){
    log("Error: Couldn't write audio buffer!");
} else {
    AT.setLoopPoints(0, bufSize, -1);
    AT.play();
}

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

Я также заметил, что, когда мое приложение работает в фоновом режиме, и я возвращаюсь к нему (из меню «Недавние приложения» или любым другим способом)Кажется, будто каждый раз создается новый экземпляр.Это означает, что вы не можете остановить другой экземпляр, играющий в фоновом режиме - за исключением случаев, когда вы используете убийцу задач ... Я уверен, что это была какая-то тривиальная ошибка новичка, которую я сделал, но мне было интересно, может ли это быть связанок синусоиде смерти.

Запуск Android 2.1.1 на Xperia X10 mini pro.

1 Ответ

1 голос
/ 03 июля 2011

Несмотря на то, что я уверен, что эта ошибка в самом Android

Кажется, это похоже на это.Есть ли шанс убедить вас опубликовать полный проект, который демонстрирует эту проблему?Кроме того, на каких версиях ОС Android вы это пробовали?

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

По определению, это невозможно.

Я не нашел решения, хотя знаю, что это как-то возможно

Нетэто не так.

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

Это неозначает, что экземпляр "приложения злой тревоги", который был принудительно закрыт, узнал об этом факте.Это означает, что «приложение злой тревоги» использует другие методы, чтобы узнать после факта , что оно умерло, и запускает новую копию.И даже если бы вы попытались сделать это самостоятельно, как вы заметили, это не помогло бы - лучшее, что вы получили бы, это сценарий "8 различных бессмертных синусоид".

Я также заметил, что когда мое приложение работает в фоновом режиме

Зачем вам писать Service для воспроизведения синусоиды?Я вижу, как он играет, когда ваша активность находится на переднем плане, но вы должны остановить синусоидальную волну в onPause(), поэтому, когда вы не на переднем плане, шум прекращается.

иЯ возвращаюсь к нему (из меню «Недавние приложения» или любым другим способом), создается впечатление, что каждый раз создается новый экземпляр

В зависимости от того, что означает «работа в фоновом режиме» икак вы попали на «задний план», это нормально.Например, нажатие кнопки НАЗАД уничтожит активность;возвращение к нему любым способом создаст новый экземпляр действия.

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