3

我想编写一个程序来检查android手机的内置麦克风是否打开、关闭或被其他应用程序使用。

如果这是可能的,那么我该怎么做?

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

4

3 回答 3

4

这是我用来检查麦克风是否忙的方法(基于 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;
    }
于 2015-04-27T10:52:00.517 回答
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);

read()的Android 文档提到了返回值ERROR_INVALID_OPERATION常量值:-3),这仅在麦克风忙时返回,因此您可以在代码中检查它并显示音频源正忙于另一个应用程序的消息.

于 2014-03-07T11:24:23.297 回答
1

据我所知,没有办法知道麦克风的状态(忙碌,可用,..)。对不起

于 2012-08-30T07:55:16.630 回答