我们可以检查一下Android手机的麦克风状态,如果可以,我该怎么做呢

时间:2012-08-30 07:44:45

标签: android microphone

我想编写一个程序来检查Android手机的内部麦克风是否已打开,关闭或正在被其他应用程序使用。

如果可以,那我该怎么做?

我在堆栈溢出时读到相关问题,但没有找到解决方案。

3 个答案:

答案 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,..)。遗憾