重要的
我找到了一个很好的解决方法来处理这个问题,您可以立即阅读该解决方法,但我强烈建议您先阅读整个解释。
场景
我试图找到一种方法来确定媒体记录器是否已开始录制,我假设调用start()
后记录器上的方法prepare()
方法已经足够了,但事实证明,还不够。
在你被我刚才的话冒犯之前,让我解释一下这个场景......
我正在从头开始构建一个简单的录音应用程序,没有库,复制粘贴,所有辛苦的工作。所以我确切地知道我的代码的每一部分在做什么。或者至少我认为我做到了。
直到我决定尝试通过单击按钮开始和停止录音来破坏我的应用程序,就像我在弹钢琴一样。是的,我的停止按钮甚至没有出现,直到媒体记录器的start()
方法被调用。
所以我遇到了崩溃,logcat 也欢迎我
java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.stop(Native Method)
随着
E/MediaRecorder(15709): stop failed: -1007
所以我在网上阅读并发现调用stop()
就在之后start()
on MediaRecorder
导致这个问题。
所以最大的问题是,如何检测现在启用录音机上的“停止”按钮是否安全?
解决方法(一点也不完美,但有效)
MediaRecorder.getMaxAmplitude() // The maximum absolute amplitude measured since the last call, or 0 when called for the first time
如您所见,MediaRecorder.getMaxAmplitude()
方法或MediaRecorder.maxAmplitude
属性第一次调用时返回 0,之后返回幅度。
因此,不要让用户在通话后立即停止录音MediaRecorder.start()
我现在正在等待,直到MediaRecorder.maxAmplitude
值大于零,此时我可以确定MediaRecorder初始化、启动、录音,处于调用的状态stop()
被允许。您可以通过使用来完成此操作可运行,不断检查直到幅度大于 0。我已经在使用计时器的可运行程序,因此我在其中执行检查。
请注意
When 在模拟器上工作,返回的值MediaRecorder.maxAmplitude
始终为 0。因此,您应该使用 Android 设备来检查一切是否按预期工作。
现在,当我第一次开始录制时,我的按钮保持禁用状态不到一秒钟。但如果我停止和开始太快,它们会保持禁用状态更长的时间,并且我会显示“录音开始时请稍候” 给用户的消息。
我希望这个答案对某人有所帮助。
Regards!