2

我为 Android 2.2 编写了一些使用 Android MediaPlayer 播放音频文件的代码。没有深入了解代码的细节,我注意到存在一个名为

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

重要的

我找到了一个很好的解决方法来处理这个问题,你可以立即阅读解决方法,但我强烈建议你先阅读整个解释。

场景

我试图找到一种方法来确定 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 设备检查一切是否按预期工作。

现在,当我第一次开始录制时,我的按钮保持禁用状态不到一秒钟。但是,如果我停止和启动太快,它们会保持禁用一段时间,并且我会向用户显示“请稍候,录制开始”消息。

我希望这个答案对某人有所帮助。

问候!

于 2021-03-26T16:47:27.810 回答