Enrutamiento de audio a auriculares Bluetooth (no A2DP) en Android

Tengo un receptor de cabeza no-A2DP del solo oído BT (Plantronics 510) y quisiera utilizarlo con mi androide HTC Magic para escuchar audio de baja calidad como podcasts / libros de audio.

Después de mucho googling encontré que sólo el audio de llamada telefónica puede ser encaminado a los auriculares no A2DP BT. (Me gustaría saber si usted ha encontrado una solución lista para la ruta de todo tipo de audio a auriculares no A2DP BT)

Así que pensé, de alguna manera programáticamente puedo canalizar el audio a la corriente que lleva el audio de llamada telefónica. De esta manera voy a engañar al teléfono para llevar mi audio mp3 a mi auricular BT. Escribí siguiendo 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, he intentado combinaciones de varios métodos que pensé engañar el teléfono para creer que mi audio es una llamada telefónica:

  • Usando el setAudioStreamType de MediaPlayer (STREAM_VOICE_CALL)
  • Utilizando el setBluetoothScoOn de AudioManager (true)
  • Utilizando 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 reproducirá desde el altavoz y si las reemplazo como se muestra arriba, el audio deja de venir de los altavoces, pero no viene a través del auricular BT. Así que esto podría ser un éxito parcial.

He comprobado que el auricular BT funciona bien con las llamadas telefónicas.

Debe haber una razón para que Android no apoye esto. Pero no puedo dejar de lado la sensación de que no es posible reorientar el audio por programación. ¿Algunas ideas?

PS código anterior necesita permiso siguiente

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

Este hilo puede estar muerto por mucho tiempo, pero para aquellos que podrían estar intentando lo mismo, algunas notas de los documentos de AudioManager pueden ser útiles. Parece que el elemento que falta es el comando startBluetoothSco () pero hay restricciones en el uso de este canal. Desde el sitio de Android Dev aquí :

Public void startBluetoothSco () Desde: Nivel de API 8 Iniciar conexión de audio Bluetooth SCO.

Requiere permiso: MODIFY_AUDIO_SETTINGS.

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

Como el establecimiento de la conexión SCO puede tardar varios segundos, las aplicaciones no deben confiar en que la conexión esté disponible cuando el método vuelva, sino que se registre para recibir la intención ACTION_SCO_AUDIO_STATE_CHANGED y espere a que el estado sea SCO_AUDIO_STATE_CONNECTED.

Como no se garantiza que la conexión tenga éxito, las aplicaciones deben esperar esta intención con un tiempo de espera.

Cuando termine con la conexión SCO o si el establecimiento se agota, la aplicación debe llamar a stopBluetoothSco () para borrar la solicitud y desactivar la conexión Bluetooth.

Incluso si se establece una conexión SCO, las siguientes restricciones se aplican a los flujos de salida de audio para que puedan ser encaminados al auricular SCO: – el tipo de flujo debe ser STREAM_VOICE_CALL – el formato debe ser mono – el muestreo debe ser de 16kHz o 8kHz

Las siguientes restricciones se aplican a los flujos de entrada: – el formato debe ser mono – el muestreo debe 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 la telefonía. Si se llama a este método mientras el teléfono está en la llamada, será ignorado. De forma similar, si se recibe o se envía una llamada mientras una aplicación está utilizando la conexión SCO, la conexión se perderá para la aplicación y NO se devolverá automáticamente cuando termine la llamada.

Vea también stopBluetoothSco () ACTION_SCO_AUDIO_STATE_CHANGED

Tenga en cuenta que no he probado esto, sólo estoy pasando a lo largo de un plomo 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 lo impidió trabajar.

Encender:

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

Apagar:

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

Lo tomé de aquí

Gran trabajo que está trabajando muy bien para mí por favor modificación de bits en su código que funcionará perfectamente es decir

 mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); to mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

Debería haber una ruta de ruta de ALSA configurada para Media Player, para que pueda abrir una ruta de audio diferente y, a continuación, enrutar su audio a auriculares BT.

No se puede ver una aplicación de trabajo aceptada clara así que poner una nueva respuesta. Esta aplicación envía música y audio a auriculares no A2dp. Prueba mi aplicación y encontrar el código fuente también en github para el código de referencia. https://github.com/sauravpradhan/AnySound2BT

  • cómo solicitar parámetros OBD y recibirlos
  • Android BLE API: GATT Notificación no recibida
  • Intención de recibir notificación sobre el evento de conexión BLE en el periférico Android
  • ¿Transferir un archivo entre dispositivos Android?
  • Android DroneKit sobre Bluetooth
  • ¿Solicitud de sincronización de Bluetooth en la barra de notificación?
  • Android, cuando debo usar syncronized en un hilo
  • ¿Comunicación Bluetooth en hilo o servicio en Android?
  • ¿Cómo establecer programaticamente tiempo detectable sin confirmación de usuario?
  • StartActivityForResult de un servicio
  • Android 4.4: Bluetooth de baja energía; Conectar sin escanear un dispositivo BLE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.