samsung llamadas funciona configurar como audifonos actualizar android audio bluetooth

llamadas - como actualizar el bluetooth de mi android



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

Tengo un audífono BT de un solo oído que no es A2DP (Plantronics 510) y me gustaría usarlo con mi HTC Magic para Android para escuchar audio de baja calidad como podcasts / audiolibros.

Después de mucho Google, descubrí que solo el audio de la llamada telefónica puede enrutarse 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)

Así que pensé, de alguna manera programáticamente, puedo canalizar el audio a la transmisión que transporta el 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 puede ver, probé combinaciones de varios métodos que pensé engañarían al teléfono para que crea que mi audio es una llamada telefónica:

  • Utilizando setAudioStreamType de MediaPlayer (STREAM_VOICE_CALL)
  • usando el setBluetoothScoOn de AudioManager (verdadero)
  • 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 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 una razón para que Android no admita esto. Pero no puedo dejar de sentir que no es posible redirigir el audio programáticamente. ¿Algunas ideas?

El código de PS arriba necesita el siguiente permiso

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


Debe haber una ruta de ruta ALSA configurada para Reproductor multimedia, de modo que pueda abrir una ruta de audio diferente y luego enrutar su audio a los auriculares BT.


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í


Este hilo puede estar muerto hace 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 faltante es el comando startBluetoothSco () pero existen restricciones en el uso de este canal. Desde el sitio de Android Dev here :

public void startBluetoothSco () Desde: API Nivel 8 Inicia la 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 a / desde un auricular SCO bluetooth mientras el teléfono no está en llamada.

Como el establecimiento de la conexión SCO puede demorar varios segundos, las aplicaciones no deben depender de que la conexión esté disponible cuando el método retorna, sino que se registran para recibir la intención ACTION_SCO_AUDIO_STATE_CHANGED y esperar 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 excedido.

Cuando finalice con la conexión SCO o si el establecimiento agota el tiempo de espera, la aplicación debe llamar a stopBluetoothSco () para borrar la solicitud y rechazar la conexión bluetooth.

Incluso si se establece una conexión SCO, las siguientes restricciones se aplican a las transmisiones de salida de audio para que se puedan enrutar a auriculares SCO: - el tipo de transmisión debe ser STREAM_VOICE_CALL - el formato debe ser mono - el muestreo debe ser de 16 kHz u 8 kHz

Las siguientes restricciones se aplican a las transmisiones 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 sobre el uso de la conexión SCO para telefonía. Si se llama a este método mientras el teléfono está en llamada, se ignorará. De forma similar, si se recibe o se envía una llamada mientras una aplicación utiliza la conexión SCO, la conexión se perderá para la aplicación y NO se devolverá automáticamente cuando finalice la llamada.

Consulte también stopBluetoothSco () ACTION_SCO_AUDIO_STATE_CHANGED

Tenga en cuenta que no lo he probado, solo le paso una pista que encontré al investigar 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.


Gran trabajo, está funcionando bien para mí, por favor, modifíquelo en su código, funcionará perfectamente, es decir,

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


No se puede ver una aplicación de trabajo clara y aceptada, por lo que se puede encontrar 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