7

まず、この素晴らしいサイトに感謝します。ここで回答された質問を検索して、多くの情報を見つけました。ただし、言及が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 を実行しています。

4

1 に答える 1

1

このバグはAndroid自体にあると確信していますが

確かにそうですね。この問題を示す完全なプロジェクトを投稿するよう説得できる可能性はありますか? また、これを試した Android OS のバージョンを教えてください。

アプリが終了する前に、最後のコード行を実行してこれを停止するために、強制終了を検出する方法を必死に探していました。

定義上、それは不可能です。

これが何らかの形で可能であることを知っていても、解決策は見つかりませんでした

いいえ、そうではありません。

(タスクキラーで殺しても生き返る邪悪なアラームアプリがあります)。

これは、強制終了された「悪の警報アプリ」インスタンスが事実を知ったという意味ではありません。これは、「邪悪な警報アプリ」が他の手法を使用して、死亡したことを発見し、新しいコピーを開始していることを意味します。そして、あなたがこれを自分でやろうとしても、あなたが指摘したように、それは役に立たないでしょう.

また、アプリがバックグラウンドで実行されていることに気付きました

Serviceサイン波を再生するためにをわざわざ書くのはなぜですか? アクティビティがフォアグラウンドにあるときに再生しているのがわかりますが、 で正弦波を停止する必要があるonPause()ため、フォアグラウンドにいないときはノイズが停止します。

(「最近のアプリ」メニューから、またはその他の方法で)それに戻ると、毎回新しいインスタンスが作成されているように見えます

「バックグラウンドでの実行」が何を意味し、どのように「バックグラウンド」に到達したかにもよりますが、これは正常です。BACK ボタンを押すと、アクティビティが破棄されます。たとえば、次のようになります。何らかの手段でそれに戻ると、新しいアクティビティ インスタンスが作成されます。

于 2011-07-03T16:07:32.003 に答える