2010-10-26 5 views
13

J'écris une application Android pour stocker et gérer des mémos vocaux avec des métadonnées de base et de marquage. Lorsque vous enregistrez du son, j'utilise:Comment enregistrer du son en utilisant un casque Bluetooth

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 

Cela fonctionne bien lorsque vous utilisez le téléphone normalement. Cependant, il ne détecte pas la présence d'un casque Bluetooth et utilise toujours le microphone du téléphone même lorsque le casque est branché.

J'ai également essayé d'utiliser MediaRecorder.AudioSource.DEFAULT, en espérant qu'il choisirait automatiquement la bonne source, mais aucun son n'a été enregistré du tout.

Comment puis-je a) détecter si un casque Bluetooth est branché et/ou b) utiliser un casque Bluetooth comme source audio pour l'enregistreur multimédia?

Répondre

0

Vous pouvez detect connected bluetooth devices comme ceci:

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()); 
    } 
} 

Cependant, je ne sais pas comment vous le faites enregistrer à partir du casque et non la MIC

1

régulière Selon la documentation dont vous avez besoin pour démarrer une SCO connexion audio avec AudioManager.startBluetoothSco(), puis il semble que vous devez utiliser MediaRecorder.AudioSource.VOICE_CALL. Dans la mesure où je peux voir, vous ne pouvez pas sélectionner un appareil en particulier et ainsi de suite. Ceci est effectué au niveau du système, c'est-à-dire après que l'utilisateur a associé le casque au téléphone.

EDIT:

Comme mentionné par Stefan, le AudioSource doit être MIC.

VOICE_CALL ne semble pas fonctionner.

6

olivierg est essentiellement droit (AudioSource peut encore être MIC), un code de base ressemblerait à ceci:

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(); 

Ce que je suis tombé moi-même sur ce juste encore une fois, je tiens à souligner l'importance du commentaire de Slott pour inclure les bonnes autorisations, le plus important pour définir

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

dans votre fichier manifeste. Sans cela, vous n'obtiendrez aucun message d'erreur mais l'état ne changera simplement pas pour connecté.

+1

Ne pas oublier de définir les autorisations: < uses- permission android: name = "android.permission.BROADCAST_STICKY" /> – slott

+0

@Stephan, j'ai essayé votre méthode et cela a bien fonctionné avec haut-parleur mains libres Bluetooth. Mais quand j'ai essayé le même code dans une voiture cela n'a pas fonctionné, aucune idée si le protocole utilisé en voiture est différent de celui des haut-parleurs mains libres? – Harish

+0

@Stephan: J'ai essayé votre code avec le bluetooth de combiné mais il enregistre seulement de mon MIC dans le téléphone. Cela ne fonctionne pas dans MIC du haut-parleur du combiné. J'utilise le haut-parleur HS3000 et la galaxie S2. C'est mon code. S'il vous plaît vérifier aidez-moi problème https://github.com/mjohn123/HeadsetRecorder – user8264

Questions connexes