Звук продолжает воспроизводиться после принудительного закрытия

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

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

Звук прекращается, как и должен, если приложение закрыто

Я пробовал:

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

Я знаю, что использовать Task Killers на 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.

7
задан nhaarman 3 July 2011 в 14:27
поделиться