如何检查android麦克风是否可用?
我目前正在编写一个应用程序,使用麦克风来查询声级。我使用AlarmManager每分钟查询一次音量。我面临的问题是,我发现如果我正在使用另一个也使用麦克风的应用程序(例如分贝级读取器),我的应用程序将崩溃,因为麦克风不可用。有没有办法检查麦克风当前是否正在使用?尝试捕获异常,因为当您尝试使用麦克风时会出现异常,您可以处理它 “即使在使用话筒时,话筒也能正常准备” 或 这个代码片段可能会给你一个想法如何检查android麦克风是否可用?,android,Android,我目前正在编写一个应用程序,使用麦克风来查询声级。我使用AlarmManager每分钟查询一次音量。我面临的问题是,我发现如果我正在使用另一个也使用麦克风的应用程序(例如分贝级读取器),我的应用程序将崩溃,因为麦克风不可用。有没有办法检查麦克风当前是否正在使用?尝试捕获异常,因为当您尝试使用麦克风时会出现异常,您可以处理它 “即使在使用话筒时,话筒也能正常准备” 或 这个代码片段可能会给你一个想法 //returns whether the microphone is available
//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中不存在,我们被迫检查“不存在”(?)异常)。如果我说的是错误的,比如“不存在”异常,请任何人纠正我,但我在任何地方都看不到它,它仍然被抛出。