如何检查android麦克风是否可用?

如何检查android麦克风是否可用?,android,Android,我目前正在编写一个应用程序,使用麦克风来查询声级。我使用AlarmManager每分钟查询一次音量。我面临的问题是,我发现如果我正在使用另一个也使用麦克风的应用程序(例如分贝级读取器),我的应用程序将崩溃,因为麦克风不可用。有没有办法检查麦克风当前是否正在使用?尝试捕获异常,因为当您尝试使用麦克风时会出现异常,您可以处理它 “即使在使用话筒时,话筒也能正常准备” 或 这个代码片段可能会给你一个想法 //returns whether the microphone is available

我目前正在编写一个应用程序,使用麦克风来查询声级。我使用AlarmManager每分钟查询一次音量。我面临的问题是,我发现如果我正在使用另一个也使用麦克风的应用程序(例如分贝级读取器),我的应用程序将崩溃,因为麦克风不可用。有没有办法检查麦克风当前是否正在使用?

尝试捕获异常,因为当您尝试使用麦克风时会出现异常,您可以处理它

“即使在使用话筒时,话筒也能正常准备”

或 这个代码片段可能会给你一个想法

//returns whether the microphone is available
    public static boolean getMicrophoneAvailable(Context context) {
        MediaRecorder recorder = new MediaRecorder();
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        recorder.setOutputFile(new File(context.getCacheDir(), "MediaUtil#micAvailTestFile").getAbsolutePath());
        boolean available = true;
        try { 
            recorder.prepare();
            recorder.start();

        }
        catch (Exception exception) {
            available = false;
        }
        recorder.release();
        return available;
    }

我还想检测是否正在使用麦克风。我的解决方案是使用AudioManager获取当前模式

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (am.getMode() == AudioManager.MODE_NORMAL){
   //microphone is available.
}
其他模式的使用,如MODE_IN_通信、MODE_IN_呼叫,请检查

如果您使用
录音
,请调用
开始录制()
,然后您应该检查录音机的状态:
getRecordingState()
。如果录制成功启动(表示麦克风可用),它将返回3(
AudioRecord.RECORDSTATE\u recording
),否则它将返回1(
AudioRecord.RECORDSTATE\u STOPPED

以下是Kotlin中此函数的代码:

private fun isMicAvailable(audioRecord: AudioRecord): Boolean {
    audioRecord.startRecording()
    val isAvailable = audioRecord.recordingState == AudioRecord.RECORDSTATE_RECORDING
    audioRecord.stop()
    audioRecord.release()
    return isAvailable
}

谢谢你的主意。即使在使用话筒时,话筒也会准备得很好。所以我所做的就是捕获start抛出的异常。如果你把这个加到你的答案中,我会接受的。我认为把
例外设置为
不是一个好的做法。您可以使用
RuntimeException
,这是在音频源不可用时引发的异常。可能很重要,但你却错过了。另外,
prepare()
会抛出其他您将丢失的异常,例如在start()之后和setOutputFile()之前调用,或者如果prepare失败。至少在我的例子中,它总是可以准备的,但是如果源代码不可用,它就不会启动。因此,我捕获
RuntimeException
,查看它是否在
start()
上可用。其他异常不应该发生,我们应该手动修复它们(可能是错误的)。但这可能是任何问题。。。这样检查是不好的…你的解决方案不正确。即使某些应用程序(如录音机)捕捉到麦克风,模式仍可能处于模式_正常。audioRecord在哪里?@MahmoudMabrok您必须使用audioRecord构造函数创建它。请看这里:。根据我刚才编写的代码,我认为您应该使用AudioRecord作为正常音频源,使用MediaRecorder作为非正常源,例如
VOICE\u CALL
。MR甚至需要一个文件来检查音频源,与AR相反,所以应该是次要的,因为用户需要给你权限来写一个文件来检查音频源,这很奇怪。AR不需要这个,但它不允许您使用非正常音频源。例如,如果AR引发异常或未初始化,请使用MR。实际上,我们可以在缓存目录中创建一个文件,而不需要任何权限。虽然我认为仍然在
start()
上检查异常(我看到发生了,但我没有看到有文档记录)不如用特定的方法检查音频记录是否正在录制(MediaRecorder中不存在,我们被迫检查“不存在”(?)异常)。如果我说的是错误的,比如“不存在”异常,请任何人纠正我,但我在任何地方都看不到它,它仍然被抛出。