Прежде всего, спасибо за этот замечательный сайт, я нашел много информации, просматривая ответы на вопросы здесь.У меня проблема, однако, что я нашел только одно упоминание (без ответа).
Я пишу приложение, которое использует 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.