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

私の知る限り、マイクの状態 (Busy、Available、..) を知る方法はありません。ごめん

于 2012-08-30T07:55:16.630 に答える