2012-12-03 147 views
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代碼,例如)一切工作正常(聲音被記錄)。

所有我想知道是否有可能錄製聲音與中央耳機按鈕按下,或者它的硬件問題,我無能爲力。

回答

2

很抱歉,但我覺得它不能對硬件的原因來完成。

Android耳機插孔有4個連接:Tip = LeftAudio,Ring = RightAudio,Ring2 = Ground,Sleeve = Mic。 (我可能有Ring2 &地面顛倒過來)。 HeadsetHook按鈕通過短接Ring2和Sleeve來發送信號。所以,當按下時它會縮短麥克風,這就解釋了爲什麼你要錄音。吮吸。不能做PushToTalk。

您的一種選擇是在onKeyDown上開始錄製並在再次單擊時停止錄製。即使這不是直截了當的,因爲如果按鈕被按下足夠長時間,你會得到多個onKeyDowns。因此,請跳過onKeyDown並使用onKeyUp。它避免了「Google即時」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; 
} 

請注意,您將在結束點擊過程中錄製靜音。

+0

但是,如果我們使用microusb頭戴式耳機,可以做些什麼嗎? – AnD

0

你如果條件

現在應該是這樣的包含此代碼。

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

更新

你停止它你自己在onKeyUp(int keyCode, KeyEvent event)事件:)

+0

它會導致空指針異常的onkeydown –

+0

NULL是什麼在這一點? –

+0

對不起,我的壞,但記錄音頻麥克風仍然被禁用 –