Cómo grabar sonido con auriculares bluetooth

Estoy escribiendo una aplicación para Android para almacenar y administrar notas de voz con algunos metadatos básicos y etiquetado. Cuando grabo sonido utilizo:

recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(currentRecordingFileName); // and so on 

Esto funciona bien cuando se utiliza el teléfono de una manera normal. Sin embargo, no detecta la presencia de un auricular bluetooth y todavía utiliza el propio micrófono del teléfono incluso cuando el auricular está enchufado.

También intenté usar MediaRecorder.AudioSource.DEFAULT, esperando que elegiría automáticamente la fuente correcta, pero entonces ningún sonido fue registrado en absoluto.

¿Cómo puedo a) detectar si un auricular bluetooth está conectado y / o b) utilizar un auricular bluetooth como fuente de audio para el grabador de medios?

Olivierg es básicamente correcto (AudioSource todavía puede ser MIC), algún código básico se vería así:

  am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1); Log.d(TAG, "Audio SCO state: " + state); if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) { /* * Now the connection has been established to the bluetooth device. * Record audio or whatever (on another thread).With AudioRecord you can record with an object created like this: * new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, * AudioFormat.ENCODING_PCM_16BIT, audioBufferSize); * * After finishing, don't forget to unregister this receiver and * to stop the bluetooth connection with am.stopBluetoothSco(); */ unregisterReceiver(this); } } }, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED)); Log.d(TAG, "starting bluetooth"); am.startBluetoothSco(); 

Esto me tropecé con esto yo solo de nuevo, quiero señalar la importancia del comentario de Slott para incluir los permisos correctos, lo más importante para establecer

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

En su archivo de manifiesto. Sin ella no obtendrá ningún mensaje de error, pero el estado simplemente no cambiará a conectado.

De acuerdo con la documentación que necesita para iniciar una conexión de audio SCO con AudioManager.startBluetoothSco () , y luego parece que necesita utilizar MediaRecorder.AudioSource.VOICE_CALL .

Por lo que puedo ver, no se puede seleccionar un dispositivo en particular y tal. Esto se realiza a nivel de sistema, es decir, después de que el usuario empareje el auricular con el teléfono.

EDITAR:

Como se mencionó por Stefan, el AudioSource necesita ser MIC.

VOICE_CALL no parece funcionar.

Puede detectar dispositivos Bluetooth conectados como este:

 Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); // If there are paired devices if (pairedDevices.size() > 0) { // Loop through paired devices for (BluetoothDevice device : pairedDevices) { // Add the name and address to an array adapter to show in a ListView mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); } } 

Sin embargo, no estoy seguro de cómo lo hace grabar desde el auricular y no el MIC regular

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.