まず、この素晴らしいサイトに感謝します。ここで回答された質問を検索して、多くの情報を見つけました。ただし、言及が1つしか見つからないという問題があります(答えはありません)。
AudioTrack を使用して、実行時に生成された正弦波をヘッドフォン ジャック経由でループさせるアプリケーションを作成しています (他の電子機器を制御するため)。これは一定の間隔で (Handler.postDelayed を使用して) 実行され、アプリケーションを強制終了した場合を除いて、問題なく動作します。その場合、アプリ自体がなくなってからずっと正弦波が再生され続け、文字通りそれを止めるためにできる唯一のことは、電話を再起動することです.
アプリケーションが適切に閉じられている場合、およびクラッシュした場合でも、サウンドは正常に停止します。
私が試してみました:
- AudioTrack インスタンスを停止して解放する onDestroy() メソッドを作成しますが、残念ながら呼び出されません。
- サウンド ループに大きなオーディオ バッファを使用する (小さなバッファ サイズがバグの原因であることを期待)。変わりはない。
- アプリを再び起動すると、2 つのおかしな正弦波が表示されます。
- アプリを完全にアンインストール (!) します: 正弦波はまだそこにあり、その墓の向こうから私を悩ませています.
- 電話をサイレント モードにする: 違いはありません。(これがユーザーに発生することを望んでいません。)
- Media Volume を完全に下げて、15 分以上待っても違いはありません。
- サンプルレートを 11、22、または 44.1 kHz に変更: 違いはありません。
- アプリの起動と終了を何度も繰り返す: 実際、この方法で 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 自体にあると確信していますが、強制終了を検出して最後の 1 行のコードを実行し、アプリが停止する前に強制終了を阻止する方法を必死に探していました。どういうわけかこれが可能であることはわかっていますが、解決策は見つかりませんでした(タスクキラーで殺しても生き返る邪悪なアラームアプリがあります)。誰かが私を啓発できるなら、私は非常に感謝しています!
また、アプリがバックグラウンドで実行されていて、(「最近のアプリ」メニューから、またはその他の方法で) アプリに戻ると、毎回新しいインスタンスが作成されているように見えることにも気付きました。これは、バックグラウンドで再生している他のインスタンスを停止できないことを意味します-タスクキラーを使用する場合を除きます...これは私が犯した些細な初心者の間違いに違いないと確信していますが、関連している可能性があるかどうか疑問に思っていました死の正弦波に。
Xperia X10 mini pro で Android 2.1.1 を実行しています。