2013-03-15 49 views
0

我有一個藍牙耳機(BTC6White)。我想對麥克風說話,Android設備播放聲音。瞭解與Android的藍牙耳機連接

那麼,我該如何做到這一點?首先,我可以建立套接字連接

socket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString("0000111e-0000-1000-8000-00805f9b34fb")); 
socket.connect(); 

然後,我如何獲取音頻?這個方法有什麼用處:startBuetoothSco?要將音頻放入揚聲器,我應該使用Auditrack嗎?

int buffersize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT); 
soundData = new byte [buffersize*5];  
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
    8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT, 
    soundData.length,AudioTrack.MODE_STREAM); 

但是,那麼,我應該填充緩衝區soundData嗎?怎麼樣?使用套接字(進入線程)?

mmInStream = socket.getInputStream(); 
    public void run() { 
    byte[] buffer = new byte[8000*2]; 
     while (true) { 
      bytes = mmInStream.read(buffer); 
      audioTrack.write(buffer, 0, bytes); //write directly? 
     }} 

和startBuetoothSco()是什麼?要了解sco狀態? SCO_AUDIO_STATE_CONNECTED ...或發送/接收數據?我不明白如何從de耳機獲取音頻數據,然後如何流式傳輸到揚聲器。有必要建立SCO連接(使用AudioManager)來獲取藍牙耳機的數據?

很難找到關於這個問題的信息,並且android文檔非常差(本主題)。

+0

您可以使用我的答案在http://stackoverflow.com/questions/14991158/using-the-android-recognizerintent-with-a-bluetooth-headset/14993590#14993590 – 2013-03-15 22:01:23

+0

奧克斯,我可以建立一個SCO連接,但是,如何獲得音頻? – jlmg5564 2013-03-16 13:13:33

+0

我不知道是否有可能將音頻從藍牙耳機路由到揚聲器。你爲什麼不嘗試SoundAbout來查看它是否首先做了類似的事情。鏈接https://play.google.com/store/apps/details?id=com.woodslink.android.wiredheadphoneroutingfix – 2013-03-17 00:09:57

回答

0

用於檢索音頻數據,您可以設置流源。舉例來說,如果你想記錄通過藍牙耳機的聲音,你可以初始化AudioRecord和AudioManager如下:

AudioRecord ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        RECORDER_SAMPLERATE, 
        RECORDER_OUT_CHANNELS, 
        RECORDER_AUDIO_ENCODING, 
        bufferSize); 
ar.startRecording(); 

,並呼籲

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
am.startBluetoothSCO(); 

然後你可以定義一個線程,用於讀取音頻數據你寫下面的代碼:

private Runnable run_record = new Runnable(){ 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     short dataBuf[] = new short[bufferSize]; 
     FileOutputStream os = null; 
     try { 
      os = new FileOutputStream(file_path); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     while(isRecording){ 
      ar.read(dataBuf, 0, bufferSize); 
      Log.d(LOG_TAG, "writing "+bufferSize+" bytes of data to file "+file_path); 
      byte data[] = short2byte(dataBuf); 
      try { 
       os.write(data, 0, bufferSize); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     try { 
      os.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    }}; 

我希望我解釋清楚。