重要的
我找到了一个很好的解决方法来处理这个问题,你可以立即阅读解决方法,但我强烈建议你先阅读整个解释。
场景
我试图找到一种方法来确定 mediarecorder 是否已经开始录制,我认为在start()
方法之后调用记录器上的prepare()
方法就足够了,但事实证明,事实并非如此。
在你被我刚才说的话冒犯之前,让我解释一下这个场景......
我正在从头开始构建一个简单的录音应用程序,没有库,复制粘贴,所有的努力。所以我确切地知道我的代码的每个部分在做什么。或者至少我认为我做到了。
直到我决定尝试通过单击按钮来破坏我的应用程序来开始和停止录音,就像我在弹钢琴一样。是的,在调用 mediarecorder 的start()
方法之前,我的停止按钮甚至都没有出现。
所以我受到了崩溃的欢迎,logcat 欢迎我
java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.stop(Native Method)
随着
E/MediaRecorder(15709): stop failed: -1007
因此,我在网上阅读并发现在onstop()
之后立即调用会导致此问题。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,之后返回幅度。
因此,我现在不是允许用户在调用后立即停止录制,而是MediaRecorder.start()
等待该MediaRecorder.maxAmplitude
值大于零,此时我可以确定MediaRecorder 已初始化、启动和录制,并且处于以下状态stop()
允许调用。您可以通过使用持续检查直到幅度大于 0 的可运行程序来完成此操作。我已经在使用一个可运行的计时器,所以我执行了检查。
请注意
在emulator 上工作时,返回的值MediaRecorder.maxAmplitude
始终为 0。因此,您应该使用 Android 设备检查一切是否按预期工作。
现在,当我第一次开始录制时,我的按钮保持禁用状态不到一秒钟。但是,如果我停止和启动太快,它们会保持禁用一段时间,并且我会向用户显示“请稍候,录制开始”消息。
我希望这个答案对某人有所帮助。
问候!