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 耳机插孔有 4 个连接:Tip=LeftAudio、Ring=RightAudio、Ring2=Ground、Sleeve=Mic。(我可能将 Ring2 和 Ground 颠倒了)。HeadsetHook 按钮通过短接 Ring2 和 Sleeve 来发送信号。因此,按下它会使麦克风短路,这就解释了为什么要录制静音。糟透了。无法进行 PushToTalk。

您的一种选择是在 onKeyDown 上开始录制并在再次单击时停止录制。即使这也不是简单的,因为如果按钮被按下足够长的时间,您将获得多个 onKeyDowns。所以跳过 onKeyDown 并使用 onKeyUp。它避免了“Google Now”媒体按钮的麻烦。就像是...

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 回答