重要
この問題を処理するための優れた回避策を見つけました。回避策はすぐに読むことができますが、最初に説明全体を読むことを強くお勧めします。
シナリオ
メディアレコーダーが記録を開始したかどうかを調べる方法を見つけようとしていましたが、メソッド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!