2

Android MediaPlayer を使用してオーディオ ファイルを再生する Android 2.2 用のコードをいくつか作成しました。コードの詳細には触れずに、という関数が存在することに気付きました。

isPlaying()

これにより、オーディオ ファイルが現在 MediaPlayer によって再生されているかどうかを確認できます。たとえば、次のコード スニペットを実行すると、

Toast.makeText(getApplicationContext(), "Sound playing is: " +
        mediaPlayer.isPlaying(), Toast.LENGTH_SHORT).show();

次のメッセージが表示されます

Sound playing is: true / false

サウンドが再生されているかどうかによって異なります。

しかし、Android MediaRecorder を使用してマイクからの音を録音するコードを書いたときに、という関数が存在するように見えないことに気付きました。

isRecording()

記録が進行中かどうかを確認します。

そのため、責任がプログラマーにあるのかどうか、コードにロジックを埋め込むことで録音が進行中かどうかを判断するかどうか、またはおそらくこれを行う方法が実際に存在するかどうか (録音が進行中かどうかを確認する) を考えていました。 Android API が提供する別の組み込み関数を使用する。

4

2 に答える 2

3

やっぱりそんな機能はないようです。これをきれいに行うために、コードに何らかのロジックを埋め込もうとするのは理にかなっていると思います。

于 2012-11-15T06:04:06.957 に答える
3

重要

この問題を処理するための優れた回避策を見つけました。回避策はすぐに読むことができますが、最初に説明全体を読むことを強くお勧めします。

シナリオ

メディアレコーダーが記録を開始したかどうかを調べる方法を見つけようとしていましたが、メソッドstart()の後にレコーダーでメソッドを呼び出すprepare()だけで十分だと思っていましたが、そうではありませんでした。

今言ったことに気分を害する前に、シナリオを説明しましょう...

私は単純なオーディオ録音アプリをゼロから構築していました。ライブラリはなく、コピーと貼り付けがすべてのハードワークでした。そのため、コードの各部分が何をしているかを正確に把握していました。または、少なくとも私はそう思った。

ピアノを弾いているように、ボタンをクリックして録音を開始および停止することで、アプリケーションを壊そうとするまでは。start()はい、メディアレコーダーのメソッドが呼び出されるまで、停止ボタンは表示されませんでした。

だから私はクラッシュで迎えられ、logcatは私を歓迎しました

java.lang.RuntimeException: stop failed.
    at android.media.MediaRecorder.stop(Native Method)

一緒に

E/MediaRecorder(15709): stop failed: -1007

stop()だから私はオンラインで読んで、すぐにstart()呼び出すとMediaRecorderこの問題が発生することがわかりました。

したがって、最大の問題は、レコーダーの STOP ボタンを有効にすることが安全であるかどうかをどのように検出するかということでした。

回避策(完全ではありませんが、機能します)

MediaRecorder.getMaxAmplitude() // The maximum absolute amplitude measured since the last call, or 0 when called for the first time

ご覧のとおり、MediaRecorder.getMaxAmplitude()メソッドまたはMediaRecorder.maxAmplitudeプロパティは、最初に呼び出されたときに 0 を返し、その後は振幅を返します。

So, instead of allowing the user to Stop the recording right after calling MediaRecorder.start() I am now waiting until the MediaRecorder.maxAmplitude value is greater than zero, at which point I can be sure that the MediaRecorder is initialized, started, and recording, and is in a state where calling stop() is allowed. You can accomplish this by using a runnable that keeps checking until the amplitude is greater than 0. I am already using a runnable for the timer, so I perform the check in that.

Please Note

When working on an emulator, the value returned by MediaRecorder.maxAmplitude is always 0. So, you should use an Android Device to check if everything works as expected.

Now my buttons stay disabled for less than a second when I first start recording. But if I stop and start too quickly, they remain disabled for a bit longer, and I show a "Please wait while the recording starts" message for the user.

I hope this answer helps someone.

Regards!

于 2021-03-26T16:47:27.810 に答える