2010-07-02 91 views
21

是的,我知道Android已經實現了藍牙耳機 配置文件,但它在音頻網關角色中,而不是在HeadSet角色中。如何使Android手機成爲藍牙耳機?

我想要做的是在Android手機上開發一個應用程序,其中 將充當藍牙耳機,因此它可以通過藍牙連接到我的筆記本電腦。 當我嘗試打電話給某人時,我可以使用手機撥打他,而我的 應用程序將通過藍牙將語音轉發到我的筆記本電腦, ,另一個在筆記本電腦上運行的應用程序將獲取語音數據 並將它們轉發給Skype或GTalk或其他VoIP程序。

換句話說,我該如何在頭戴式耳機中實現Headset Profile 在Android手機上的角色?提前致謝!

+0

我想要類似的功能性。我希望通過電話將來自電話的音頻(VOICE_DOWNLINK)作爲揚聲器電話發回PC。但保留麥克風在電話 – Mark 2010-09-06 21:27:56

+0

這不是一個微不足道的要求;在bluez最少需要a)爲SDP記錄添加免提角色。 b)從SDP記錄中刪除音頻網關。 c)改變手機的設備類模仿耳機。這只是通過免提配置文件進行連接。就發送音頻等而言,這是另一個挑戰。我不確定bluedroid是否支持此功能;您可能需要定製內核。 – TwinPrimesAreEz 2014-04-24 21:56:46

回答

4

從Android方面,我認爲最好的辦法就是打開你的電腦服務的連接:

URL url = new URL("http://192.186.0.1/path/to/service"); 
URLConnection connection = url.openConnection(); 

將它作爲一個OutputStream:

OutputStream out = new BufferedStream(connection.getOutputStream()); 

,然後使用AudioRecord發送雖然記錄的數據:

public static final int DEFAULT_SAMPLE_RATE = 8000; 
private static final int DEFAULT_BUFFER_SIZE = 4096; 
private static final int CALLBACK_PERIOD = 4000; 

AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 
      DEFAULT_SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, 
      AudioFormat.ENCODING_DEFAULT, DEFAULT_BUFFER_SIZE); 
recorder.setPositionNotificationPeriod(CALLBACK_PERIOD); 

int bytesRead = 0; 
ByteBuffer buffer = ByteBuffer.allocateDirect(DEFAULT_BUFFER_SIZE); 
while ((bytesRead = recorder.read(buffer, DEFAULT_BUFFER_SIZE)) > 0) { 
    out.write(buffer.array(), 0, bytesRead); 
} 

所有這些都應該在一個單獨的線程上完成,以避免應用程序崩潰,並在錄製停止或連接丟失時處理機制。此外,我很確定它應該通過WiFi工作,雖然我不確定它是否會與藍牙一樣(儘管大多數帶有BT的設備現在有wifi,並且您獲得更多帶寬)

我還沒有測試這個代碼,所以我不是100%肯定它會工作。

接下來的事情是在機器上將音頻傳輸到需要的應用程序,但這是我的經驗。我想你將不得不做一個虛擬驅動程序或類似的東西。 也必須對從桌面應用程序發送到手機的音頻進行相反的處理(我對該部分感興趣,因爲它會爲觀看電影製作一個漂亮的無線耳機)。

這是我的2美分;我很想知道它是否有效。 ;)

+0

在固件/驅動程序級別的大多數Android手機上阻止語音通話期間從電話線錄製音頻流。您可以使用自定義內核在某些電話上解鎖此類功能。 – kord 2013-03-15 13:31:40

1

我不知道我是否理解真正的問題或您的主要目標......但我已經發布here如何通過藍牙在您的耳機接收和發送聲音。

我希望能幫助你...