我想编写一个程序来检查Android手机的内部麦克风是否已打开,关闭或正在被其他应用程序使用。
如果可以,那我该怎么做?
我在堆栈溢出时读到相关问题,但没有找到解决方案。
答案 0 :(得分:3)
以下是我用来检查麦克风是否忙碌(基于Odaym答案和我自己的测试):
(更新与Android 6.0 Marshmallow兼容性,如评论中所示)
public static boolean checkIfMicrophoneIsBusy(Context ctx){
AudioRecord audio = null;
boolean ready = true;
try{
int baseSampleRate = 44100;
int channel = AudioFormat.CHANNEL_IN_MONO;
int format = AudioFormat.ENCODING_PCM_16BIT;
int buffSize = AudioRecord.getMinBufferSize(baseSampleRate, channel, format );
audio = new AudioRecord(MediaRecorder.AudioSource.MIC, baseSampleRate, channel, format, buffSize );
audio.startRecording();
short buffer[] = new short[buffSize];
int audioStatus = audio.read(buffer, 0, buffSize);
if(audioStatus == AudioRecord.ERROR_INVALID_OPERATION || audioStatus == AudioRecord.STATE_UNINITIALIZED /* For Android 6.0 */)
ready = false;
}
catch(Exception e){
ready = false;
}
finally {
try{
audio.release();
}
catch(Exception e){}
}
return ready;
}
答案 1 :(得分:2)
如果您使用AudioRecord
对象录制音频,例如:
AudioRecord audio = new AudioRecord(MediaRecorder.AudioSource.MIC,
Constants.SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,Constants.BUFFER_SIZE_BYTES);
audio.startRecording();
然后在audio.startRecording()
之后,你将不得不提供一个缓冲区来读取音频数据并开始阅读。你这样做:
int audioStatus = audio.read(bufferObject, 0, bufferSize);
Android documentation for read()提到了返回值ERROR_INVALID_OPERATION
(常数值:-3 ),只有当麦克风忙时才会返回,这样您就可以在代码并显示音频源正忙于另一个应用程序的消息。
答案 2 :(得分:1)
据我所知,无法知道麦克风的状态(Busy,Available,..)。遗憾