我正在编写一个使用麦克风查询声级的应用。我正在使用AlarmManager每分钟查询声级。我面临的问题是,我发现如果我正在使用另一个使用麦克风的应用程序(例如分贝级读卡器),我的应用程序将崩溃,因为麦克风不可用。有没有办法检查当前是否正在使用麦克风?
答案 0 :(得分:3)
尝试捕获异常,因为当您尝试使用麦克风时会遇到异常,您可以处理它。
"即使麦克风正在使用中,麦克风也会准备好#34;
OR 这段代码可能会给你一个想法
//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;
}
答案 1 :(得分:0)
我还想检测是否正在使用麦克风。我的解决方案是使用AudioManager获取当前模式。
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (am.getMode() == AudioManager.MODE_NORMAL){
//microphone is available.
}
其他模式用法如MODE_IN_COMMUNICATION,MODE_IN_CALL,请检查 https://developer.android.com/reference/android/media/AudioManager.html#MODE_NORMAL
答案 2 :(得分:0)
如果您使用AudioRecord
,然后呼叫startRecording()
,然后您应该检查记录器的状态:getRecordingState()
。如果录制成功开始(这意味着麦克风可用),它将返回3(AudioRecord.RECORDSTATE_RECORDING
),否则将返回1(AudioRecord.RECORDSTATE_STOPPED
)
以下是Kotlin中此功能的代码:
private fun isMicAvailable(audioRecord: AudioRecord): Boolean {
audioRecord.startRecording()
val isAvailable = audioRecord.recordingState == AudioRecord.RECORDSTATE_RECORDING
audioRecord.stop()
audioRecord.release()
return isAvailable
}