2011-08-27 12 views
5

Durante los últimos días he intentado reproducir cualquier sonido con mis auriculares bluetooth sco desde mi teléfono Android. Mi objetivo final con este proyecto es eventualmente hacer un abridor de puerta de garaje, pero primero necesito poder reproducir el sonido por los auriculares.Android: reproducción de sonido con auriculares Bluetooth Sco

Aquí es la base del código actual que estoy 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(); 

antes de correr esto, puedo emparejar el auricular Bluetooth a mi teléfono y lo han conectado. He verificado que funciona llamando a mi correo de voz. Sin embargo, cuando ejecuto mi código, no sale ningún sonido de ninguna parte.

Éstos son los efectos de las diferentes líneas de código:

Cuando estoy corriendo mi aplicación:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

Esta línea hace que todos los de mi parada de sonido de trabajo sin importar lo que haga, por lo que suele ser comentado.

audioManager.startBluetoothSco(); 
    audioManager.setBluetoothScoOn(true); 

Estas dos líneas hacen la parada de sonido que sale del altavoz frontal y crea el auricular clic y se burlará como que está encendido pero no hay salida.

AudioManager.STREAM_VOICE_CALL 

Esto es parte de mi llamada al constructor de AudioTrack, pero hace una gran diferencia. Como está configurado en STREAM_VOICE_CALL, el sonido sale del altavoz delantero, si configuro STREAM_MUSIC, el sonido sale por el altavoz trasero.

Cuando abro mi aplicación durante una llamada:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

Durante una llamada, esta línea tiene ningún efecto porque MODE_IN_CALL ya se estableció. Pero lo que es diferente es que mi sonido se mezcla con la llamada telefónica, mientras que normalmente no se reproduce en absoluto.

audioManager.startBluetoothSco(); 
    audioManager.setBluetoothScoOn(true); 

Éstos, con sus contrapartes desconectadas, controlan de dónde viene el audio. Si los apago, mi sonido y la llamada telefónica provienen del altavoz frontal, con estos encendidos, la llamada telefónica proviene de mis auriculares y mi sonido se pierde.

En cuanto a por qué mi código no funciona, sinceramente no tengo ni idea. Creo que he cumplido con la lista de verificación para usar 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 

Entonces, ¿alguien tiene una idea de lo que estoy haciendo mal? Hubo una vez que logré que mi sonido se reprodujera a través de los auriculares, pero fue solo un tono corto cuando olvidé detener() mi AudioTrack, así que tengo que suponer que fue un error técnico.

+0

¿Dónde configuró AudioManager.MODE_NORMAL en este código? – RedBullet

Respuesta

0

De hecho, me las arreglé para solucionar este problema. El problema era que mi tono que toqué por los auriculares era demasiado alto de frecuencia. Lo arreglé simplemente duplicando el código que crea el archivo de audio para que llegue ALTO ALTO BAJO BAJO en lugar de ALTO BAJO ALTO BAJO.

+0

Soy muy nuevo en Android. Me enfrento exactamente al mismo problema al que se enfrentaba el interlocutor (thepenguin77). Lo revisé por todos los motivos posibles, pero no tuve suerte. Muy probablemente su solución resolverá el problema. Pero desafortunadamente no puedo entender la forma en que resolviste. Sería útil para mí si explicas, qué quieres decir con "duplicar el código que crea el archivo de audio" y "ALTO ALTO BAJO BAJO". ¿Quiso decir algo acerca de ponerle valor al constructor de "AudioTrack"? –

0

Intenta configurar el audiomanager en AudioManager.MODE_NORMAL. Eso funcionó para mí.

+1

Estoy bastante seguro de que cuando estaba trabajando en esto, lo configuré en MODE_NORMAL y el sonido simplemente se reprodujo en el altavoz primario en lugar del auricular del teléfono celular. Sin embargo, podría estar equivocado, pero está funcionando ahora. – thepenguin77

0

Agregar a manifestar:

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

Como nunca me equivoqué con la configuración de Bluetooth, no era necesario. – thepenguin77

1

Encontré la solución en este page. Debe llamar al audioManager.setMode(AudioManager.MODE_IN_CALL); solo después de que el socket esté conectado, es decir, recibió AudioManager.SCO_AUDIO_STATE_CONNECTED. Pude escuchar el TTS en mi Spica corriendo android 2.2.2.

Editar: Aquí está mi (antiguo) aplicación:

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

No sé si todavía está trabajando con las nuevas API.

+3

El enlace no funciona. ¿Puedes publicar un nuevo enlace de trabajo? – chaitanya

Cuestiones relacionadas