2010-07-02 14 views
21

Sì, so che Android ha già implementato il profilo auricolare Bluetooth , ma è nel ruolo Gateway audio, non nel ruolo HeadSet.Come rendere il telefono Android un auricolare bluetooth?

Quello che voglio fare è sviluppare un'applicazione su telefono Android che fungerà da auricolare bluetooth, in modo che possa connettersi al mio portatile tramite bluetooth . Quando provo a chiamare qualcuno, posso usare il mio telefono per comporlo, e la mia applicazione inoltrerà la voce tramite bluetooth al mio laptop, e un'altra applicazione in esecuzione sul portatile otterrà i dati vocali e li inoltrerà a Skype o GTalk o qualche altro programma VoIP.

In altre parole, come è possibile implementare il profilo dell'auricolare nel ruolo dell'auricolare sul telefono Android? Grazie in anticipo!

+0

Voglio volere una funzionalità simile. Desidero effettuare chiamate dal PC per inviare l'audio (VOICE_DOWNLINK) al PC come altoparlante. ma tieni il microfono al telefono – Mark

+0

Questa non è una richiesta banale; in bluez a un minimo necessario a) aggiungere il ruolo di mani libere ai record SDP. b) Rimuovere il gateway audio dal record SDP. c) Cambiare la classe del dispositivo del telefono per simulare un auricolare. Questo è solo per connettersi sopra il profilo a mani libere. Per quanto riguarda l'invio dell'audio, ecc., Questa è un'altra sfida. Non sono sicuro che bluedroid abbia anche il supporto per questo, potrebbe essere necessario un kernel personalizzato. – TwinPrimesAreEz

risposta

4

Dal lato Android, credo che la soluzione migliore è quella di aprire la connessione al servizio nel computer:

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

garantita come un OutputStream:

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

e poi utilizzare un AudioRecord per inviare i dati registrati:

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); 
} 

Tutto ciò dovrebbe essere fatto su un thread separato, ovviamente per evitare crash dell'applicazione e un meccanismo da gestire quando la registrazione si interrompe o la connessione viene persa. Inoltre, sono abbastanza sicuro che dovrebbe funzionare su wifi, anche se non sono sicuro se sarà lo stesso con bluetooth (anche se la maggior parte dei dispositivi con BT ha ora un Wi-Fi a giorni e si ottiene più larghezza di banda)

Non ho testato questo codice quindi non sono sicuro al 100% che funzioni.

La prossima cosa sarà sulla macchina per trasferire l'audio nell'app dei desideri, ma questo è al di sopra della mia esperienza. Immagino che dovrai fare un autista virtuale o qualcosa del genere. Dovrà anche fare il meccanismo inverso per l'audio inviato dall'app desktop al telefono (sono piuttosto interessato a quella parte dato che farebbe una bella cuffia wireless per guardare anche i film).

Ecco i miei 2 centesimi; Sono desideroso di sapere se funziona. ;)

+0

La registrazione del flusso audio dalla linea telefonica durante la chiamata vocale è bloccata sulla maggior parte dei telefoni Android a livello di firmware/driver. È possibile utilizzare il kernel personalizzato per sbloccare tale funzionalità su alcuni telefoni. – kord

1

Non so se ho capito la vera domanda o il tuo obiettivo principale ... ma avevo postato here come ricevere e inviare il suono dall'auricolare tramite bluetooth in Android.

Spero di aiutarti ...