2010-01-27 26 views
38

Tengo un auricular de oído único A2DP no A2DP (Plantronics 510) y me gustaría usarlo con mi HTC Magic para escuchar audio de baja calidad como podcasts/audio libros.Enrutamiento de audio a auriculares Bluetooth (no A2DP) en Android

Después de mucho Google, encontré que solo el audio de la llamada telefónica se puede enrutar a los auriculares que no son A2DP BT. (Me gustaría saber si ha encontrado una solución lista para enrutar todo tipo de audio a auriculares que no sean A2DP BT)

Me di cuenta de que, de forma programática, puedo canalizar el audio a la transmisión de audio de la llamada telefónica. De esta manera engañaré al teléfono para que lleve mi audio mp3 a mis auriculares BT. Escribí siguiendo un código simple.

import android.content.*; 
import android.app.Activity; 
import android.os.Bundle; 
import android.media.*; 
import java.io.*; 
import android.util.Log; 

public class BTAudioActivity extends Activity 
{ 
    private static final String TAG = "BTAudioActivity"; 

    private MediaPlayer mPlayer = null; 
    private AudioManager amanager = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     amanager.setBluetoothScoOn(true); 
     amanager.setMode(AudioManager.MODE_IN_CALL); 

     mPlayer = new MediaPlayer(); 

     try { 
      mPlayer.setDataSource(new FileInputStream(
       "/sdcard/sample.mp3").getFD()); 

      mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

      mPlayer.prepare(); 

      mPlayer.start(); 
     } catch(Exception e) { 
      Log.e(TAG, e.toString()); 
     } 
    } 

    @Override 
    public void onDestroy() 
    { 
     mPlayer.stop(); 
     amanager.setMode(AudioManager.MODE_NORMAL); 
     amanager.setBluetoothScoOn(false); 
     super.onDestroy(); 
    } 
} 

Como se puede ver Probé combinaciones de varios métodos que pensé que le engañar al teléfono para creer que mi audio es una llamada telefónica:

  • Usando setAudioStreamType de MediaPlayer (STREAM_VOICE_CALL)
  • usando AudioManager de setBluetoothScoOn (verdadero)
  • usando setMode de AudioManager (MODE_IN_CALL)

Pero ninguno de los anteriores funcionó. Si elimino las llamadas de AudioManager en el código anterior, el audio se reproduce desde el altavoz y si las reemplazo como se muestra arriba, entonces el audio deja de venir de los altavoces, pero no llega a través del auricular BT. Entonces esto podría ser un éxito parcial.

He comprobado que los auriculares BT funcionan bien con las llamadas telefónicas.

Debe haber un motivo para que Android no admita esto. Pero no puedo dejar de sentir que no es posible redirigir el audio programáticamente. ¿Algunas ideas?

P.S. por encima de código necesita permiso siguiente

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

+0

Puede que no necesite escribir ningún código usted mismo. Simplemente instala una aplicación gratuita diseñada para hacer lo que quieras. Consulte la pregunta de Android.SE: ["¿Es posible dirigir toda la salida de audio, incluida la salida de música, a un auricular Bluetooth?"] (Http://android.stackexchange.com/questions/19336/is-it-possible- to-direct-all-audio-output-to-a-bluetooth-headset) Intenté algunas aplicaciones diferentes. Al final, "Mono Bluetooth Router" fue el único que funcionó para mí. – unforgettableid

Respuesta

2

Debe haber una trayectoria de la ruta ALSA configurado para el reproductor de medios, para que pueda abrir un camino diferente de audio y luego ruta de audio al auricular BT.

13

Este hilo puede estar muerto hace mucho tiempo, pero para aquellos que puedan estar intentando lo mismo, algunas notas de los documentos de AudioManager pueden ser útiles. Parece que el elemento faltante es el comando startBluetoothSco() pero existen restricciones en el uso de este canal. Desde el sitio Android Dev here:

startBluetoothSco public void() desde: API Nivel 8 Start bluetooth SCO conexión de audio.

Requiere permiso: MODIFY_AUDIO_SETTINGS.

Este método puede ser utilizado por aplicaciones que deseen enviar y recibir audio a/desde un bluetooth SCO auricular cuando el teléfono no está en llamada.

A medida que el establecimiento de la conexión SCO puede tardar varios segundos, aplicaciones no deben depender de la conexión a estar disponible cuando el método devuelve sino que se registren para recibir el intención ACTION_SCO_AUDIO_STATE_CHANGED y esperar a que el Estado sea SCO_AUDIO_STATE_CONNECTED.

Como la conexión no está garantizada a , las aplicaciones deben esperar este intento con un tiempo de espera agotado.

Cuando haya terminado con la conexión SCO o si los tiempos de establecimiento a cabo, la aplicación debe llamar stopBluetoothSco() para borrar la solicitud y bajar el bluetooth conexión.

Incluso si se establece una conexión OCS, los siguientes restricciones se aplican en la salida de audio corrientes para que puedan ser enviados a auricular SCO: - el tipo de flujo debe ser STREAM_VOICE_CALL - el formato debe ser mono - el muestreo debe ser de 16 kHz o 8 kHz

las siguientes restricciones se aplican en flujos de entrada: - el formato debe estar mono - el muestreo deberá ser de 8 kHz

Tenga en cuenta que la aplicación del teléfono siempre tiene prioridad en el uso de la conexión SCO para telefonía. Si se llama a este método mientras el teléfono está en , se ignorará. Del mismo modo, si se recibe o envía una llamada mientras una aplicación está utilizando la conexión SCO , la conexión será perdido para la aplicación y no devuelto automáticamente cuando la llamada termina .

Ver también stopBluetoothSco() ACTION_SCO_AUDIO_STATE_CHANGED

Tenga en cuenta que no he probado esto, sólo estoy pasando por una ventaja que encontré en la investigación de un proyecto similar. Creo que Jayesh estaba cerca de la solución y las restricciones anteriores pueden haber sido lo que impedía su funcionamiento.

+0

¡Brillante! Gracias :) – Force

+0

startBluetoothSco() and

+0

He agregado esta STREAM_VOICE_CALL pero en algunos dispositivos Samsung (Samsung S6) funciona y en otros no funciona. ¿Hay algún otro modo para grabar voz desde el modo bluetooth para todos los dispositivos? También lo intenté con MODE_IN_COMMUNICATION. –

5

Para encender:

localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
localAudioManager.setMode(0); 
localAudioManager.setBluetoothScoOn(true); 
localAudioManager.startBluetoothSco(); 
localAudioManager.setMode(AudioManager.MODE_IN_CALL); 

Para apagar:

localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
localAudioManager.setBluetoothScoOn(false); 
localAudioManager.stopBluetoothSco(); 
localAudioManager.setMode(AudioManager.MODE_NORMAL); 

I took it from here

3

Gran Obra que está trabajando bien para mí, por favor, haga la modificación de bit en el código que va a trabajar perfectamente es decir

mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

to 

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
+1

Gracias Aditya, Gran trabajo ... –

0

No se puede ver una aplicación de trabajo clara y aceptada, por lo que se puede obtener una nueva respuesta. Esta aplicación enruta la música y el audio a auriculares que no sean A2dp. Pruebe mi aplicación y encuentre el código fuente también en github para el código de referencia.https://github.com/sauravpradhan/AnySound2BT

Cuestiones relacionadas