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.
¿Dónde configuró AudioManager.MODE_NORMAL en este código? – RedBullet