2011-08-27 16 views
5

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.

+0

Dove hai impostato AudioManager.MODE_NORMAL in questo codice? – RedBullet

risposta

0

ho effettivamente riuscito a risolvere questo problema. Il problema era che il mio pitch che suonavo con l'headset era troppo alto. L'ho risolto semplicemente raddoppiando il codice che crea il file audio in modo che sia HIGH HIGH LOW LOW anziché HIGH LOW HIGH LOW.

+0

Sono molto nuovo ad Android. Sto affrontando esattamente lo stesso problema che ha affrontato l'interrogante (thepenguin77). Ho controllato tutte le possibili ragioni, ma senza fortuna. Molto probabilmente la tua soluzione risolverà il problema. Ma sfortunatamente non riesco a capire come hai risolto. Sarebbe utile per me se spiegassi cosa intendi con "raddoppio del codice che crea il file audio" e "HIGH HIGH LOW LOW". Intendevi qualcosa sul mettere valore al costruttore "AudioTrack"? –

0

Provare ad impostare audiomanager su AudioManager.MODE_NORMAL. Thos ha funzionato per me.

+1

Sono abbastanza sicuro quando stavo lavorando su questo, l'ho impostato su MODE_NORMAL e il suono è stato riprodotto semplicemente dall'altoparlante principale piuttosto che dall'auricolare del cellulare. Potrei sbagliarmi, ma funziona ora. – thepenguin77

0

Add manifestare:

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.BLUETOOTH" /> 
+0

Dato che non ho mai avuto problemi con le impostazioni bluetooth, quelle non erano necessarie. – thepenguin77

1

Ho trovato la soluzione su questo page. È necessario chiamare audioManager.setMode(AudioManager.MODE_IN_CALL); solo dopo aver collegato il socket, ad esempio, si è ricevuto AudioManager.SCO_AUDIO_STATE_CONNECTED. Potrei sentire il TTS sulla mia Spica con Android 2.2.2.

Edit: Ecco il mio (vecchio) implementazione:

public class BluetoothNotificationReceiver 
extends BroadcastReceiver 
{ 

    /** 
    * 
    */ 
    public BluetoothNotificationReceiver(Handler h) 
    { 
     super(); 
     bnrHandler = h; 
    } 

    /* (non-Javadoc) 
    * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) 
    */ 
    @Override 
    public void onReceive(Context arg0, Intent arg1) 
    { 
     String action = arg1.getAction(); 
     if (action.equalsIgnoreCase(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED)) 
     { 
      int l_state = arg1.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1); 
      Log.d("bnr", "Audio SCO: " + AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED); 
      switch(l_state) 
      { 
      case AudioManager.SCO_AUDIO_STATE_CONNECTED: 
      { 
       Log.i("bnr", "SCO_AUDIO_STATE_CONNECTED"); 
      } 
      break; 
      case AudioManager.SCO_AUDIO_STATE_DISCONNECTED: 
       { 
        Log.e("bnr", "SCO_AUDIO_STATE_DISCONNECTED");     
       } 
      break; 
      default: Log.e("bnr", "unknown state received:"+l_state); 
      } 
     } 
     else 
      Log.e("bnr", "onReceive:action="+action); 
    } 
} 

Non so se è ancora lavorando con le nuove API.

+3

Il collegamento non funziona. Puoi per favore pubblicare un nuovo link di lavoro – chaitanya

Problemi correlati