Negli ultimi giorni ho cercato di riprodurre qualsiasi suono tramite il mio auricolare Bluetooth Sco dal mio telefono Android. Il mio obiettivo finale con questo progetto è quello di realizzare un apriporta da garage, ma prima devo essere in grado di riprodurre l'audio con l'auricolare.Android: riproduzione audio tramite auricolare Bluetooth Sco
Qui è la base del codice corrente sto usando:
==Manifest==
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
==Code==
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
short[] soundData = new short [8000*20];
for (int iii = 0; iii < 20*8000; iii++) {
soundData[iii] = 32767;
iii++;
soundData[iii] = -32768;
}
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
8000, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, soundData.length
* Short.SIZE, AudioTrack.MODE_STATIC);
audioTrack.write(soundData, 0, soundData.length);
audioTrack.play();
Prima ho eseguito questo, accoppiare l'auricolare Bluetooth al telefono e lo hanno collegato. Ho verificato che funziona chiamando la mia segreteria telefonica. Tuttavia, quando eseguo il mio codice, nessun suono proviene da nessuna parte.
Ecco gli effetti delle diverse linee di codice:
Quando sto solo eseguendo la mia app:
audioManager.setMode(AudioManager.MODE_IN_CALL);
Questa linea fa tutto il mio arresto audio di lavoro, non importa quello che faccio, quindi è tipicamente commentato.
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
Queste due linee rendono la fermata del suono che esce dal diffusore anteriore e fare il mio auricolare clic e sibilano come se fosse acceso, ma non c'è alcuna uscita.
AudioManager.STREAM_VOICE_CALL
Questo è parte della mia chiamata al costruttore AudioTrack, ma fa una bella differenza. Poiché questo è impostato su STREAM_VOICE_CALL, il suono esce dall'altoparlante anteriore, se lo imposto su STREAM_MUSIC, il suono viene emesso dall'altoparlante posteriore.
Quando ho aperto la mia app durante una chiamata:
audioManager.setMode(AudioManager.MODE_IN_CALL);
Durante una chiamata, questa linea ha alcun effetto perché MODE_IN_CALL era già impostato. Ma ciò che è diverso è che il mio suono è mescolato con la telefonata, mentre normalmente non suona affatto.
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
Questi, con la loro controparte a metà, controllano da dove proviene l'audio. Se li spengo, il mio suono e la telefonata arrivano dall'altoparlante anteriore, con questi accesi, la telefonata arriva dall'auricolare e il mio suono è perso.
Per quanto riguarda il motivo per cui il mio codice non funziona, sinceramente non ne ho idea. Credo di aver soddisfatto la lista di controllo per l'utilizzo di startBluetoothSco().
Even if a SCO connection is established, the following restrictions
apply on audio output streams so that they can be routed to SCO headset:
- the stream type must be STREAM_VOICE_CALL - the format must be mono -
the sampling must be 16kHz or 8kHz
Quindi, qualcuno ha un'idea di cosa sto facendo male? C'è stata una volta in cui sono riuscito a far suonare il mio suono attraverso l'auricolare, ma è stato solo un breve tono quando ho dimenticato di smettere() il mio AudioTrack quindi devo presumere che sia stato un problema tecnico.
Dove hai impostato AudioManager.MODE_NORMAL in questo codice? – RedBullet