4

ヘッドセットのセンター ボタンに問題があります。私がやろうとしているのは、ヘッドセットのボタンが押されている間に音を録音することです。ボタンを放すと、オーディオ録音が停止します。これが私のコードです:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    text = (TextView) findViewById(R.id.text);

}

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK && shouldContinue == true) {
        shouldContinue = false;
        text.setText("KEY DOWN");

                    audioRecorder = new MediaRecorder();
                    audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    audioRecorder
                            .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    audioRecorder
                            .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    audioRecorder.setOutputFile(Environment
                            .getExternalStorageDirectory().getAbsolutePath()
                            + "/test.3gp");

                    try {
                        audioRecorder.prepare();

                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    audioRecorder.start();
                }
    return false;
}


public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK) {
        text.setText("KEY UP");
        audioRecorder.stop();
        audioRecorder.release();
        shouldContinue=true;

    }
    return false;
}

問題は、ヘッドセットのボタンを押したままにすると、マイクが何らかの形で無効になり、空のサウンド ファイルが生成されることですが、そのボタンを押したままにしなくても (たとえば、onCreate で audioRecorder コードを移動すると)、すべて正常に動作します (サウンドが録音されます)。

中央のヘッドセット ボタンを押した状態でサウンドを録音できるかどうか、またはハードウェアの問題であり、それについては何もできないかどうかを知りたいだけです。

4

2 に答える 2

2

申し訳ありませんが、ハードウェア上の理由からできないと思います。

Android ヘッドセット ジャックには、Tip=LeftAudio、Ring=RightAudio、Ring2=Ground、Sleeve=Mic の 4 つの接続があります。(Ring2 と Ground が逆になっている可能性があります)。ヘッドセット フック ボタンは、Ring2 とスリーブを短絡することによって信号を送信します。そのため、押している間はマイクがショートします。これは、無音を録音している理由を説明しています。最悪。プッシュツートークができません。

1 つのオプションは、onKeyDown で記録を開始し、もう一度クリックすると記録を停止することです。ボタンが十分に長く押されると、複数の onKeyDowns が発生するため、これでも簡単ではありません。したがって、onKeyDown をスキップして onKeyUp を使用してください。「Google Now」の MediaButton の煩わしさを回避できます。何かのようなもの...

boolean recording = false;

// don't need to override onKeyDown()
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK) {
        if (recording)
            stopAndSaveRecording();
        else
            startRecording();
        recording = ! recording;
    }
    return true;
}

最後のクリック中に無音を記録することに注意してください。

于 2014-01-27T20:51:01.557 に答える
0

このコードを if 条件に含めます

今はこのようになっているはずです。

  if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK && shouldContinue == true && event.getAction() == KeyEvent.ACTION_DOWN)

アップデート

onKeyUp(int keyCode, KeyEvent event)あなたはイベントでそれを自分で止めています:)

于 2012-12-03T13:33:20.953 に答える