2010-01-27 9 views
38

J'ai un casque unique oreille BT non A2DP (Plantronics 510) et souhaite l'utiliser avec mon Android HTC Magic pour écouter le son de mauvaise qualité comme des podcasts audio/livres.audio routage à Bluetooth (non A2DP) sur Android

Après googler que je trouve que son seul appel téléphonique peut être acheminé vers les casques non-BT A2DP. (Je voudrais savoir si vous avez trouvé une solution prête à acheminer toutes sortes d'audio à des casques BT non-A2DP)

Donc, je me suis dit, en quelque sorte par programmation, je peux canaliser l'audio vers le flux qui achemine l'appel téléphonique. De cette façon, je vais tromper le téléphone pour transporter mon audio mp3 à mon casque BT. J'ai écrit après le code 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(); 
    } 
} 

Comme vous pouvez le voir, j'ai essayé des combinaisons de différentes méthodes que je pensais tromperont le téléphone pour croire que mon audio est un appel téléphonique:

  • En utilisant la setAudioStreamType de MediaPlayer (STREAM_VOICE_CALL)
  • utilisant AudioManager de setBluetoothScoOn (true)
  • utilisant la setMode de AudioManager (MODE_IN_CALL)

Mais aucun de ce qui précède n'a fonctionné. Si je supprime les appels AudioManager dans le code ci-dessus, le son est lu par le haut-parleur et si je les remplace comme indiqué ci-dessus, le son cesse de sortir des haut-parleurs, mais ne passe pas par le casque BT. Donc, cela pourrait être un succès partiel.

J'ai vérifié que le casque BT fonctionne bien avec des appels téléphoniques.

Il doit y avoir une raison pour Android ne supportant pas cela. Mais je ne peux pas laisser aller le sentiment qu'il n'est pas possible de rediriger par programmation l'audio. Des idées?

P.S. code ci-dessus a besoin suivant l'autorisation

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

+0

Vous n'avez pas besoin d'écrire du code vous-même. Installez simplement une application gratuite conçue pour faire ce que vous voulez. Voir la question Android.SE: ["Est-il possible de diriger toutes les sorties audio, y compris la sortie de musique, vers un casque Bluetooth?"] (Http://android.stackexchange.com/questions/19336/is-it-possible- to-direct-all-audio-output-to-a-bluetooth-headset) J'ai essayé quelques applications différentes. En fin de compte, "Mono Bluetooth Router" était le seul qui a fonctionné pour moi. – unforgettableid

Répondre

2

Il devrait y avoir un chemin d'itinéraire ALSA configuré pour lecteur multimédia, afin qu'il puisse ouvrir un chemin audio différent et puis la route de l'audio pour casque BT.

13

Ce fil peut être mort depuis longtemps, mais pour ceux qui pourraient essayer la même chose, quelques notes de la documentation AudioManager peut être utile. Il semble que l'élément manquant soit la commande startBluetoothSco() mais il y a des restrictions sur l'utilisation de ce canal. Sur le site Dev Android here:

startBluetoothSco vide public() depuis: API Niveau 8 bluetooth SCO démarrage connexion audio.

Nécessite l'autorisation MODIFY_AUDIO_SETTINGS.

Cette méthode peut être utilisée par applications qui souhaitent envoyer et reçu audio vers/depuis un casque Bluetooth SCO alors que le téléphone est pas appel.

Comme l'établissement de la connexion SCO peut prendre plusieurs secondes, les applications ne doivent pas compter sur la connexion à disponible lorsque la méthode retourne mais inscrivez-vous à la place pour recevoir le ACTION_SCO_AUDIO_STATE_CHANGED intention et attendre que l'état d'être SCO_AUDIO_STATE_CONNECTED.

Comme la connexion n'est pas garantie à réussir, les applications doivent attendre cette intention avec un délai d'expiration.

Lorsque vous avez terminé avec la connexion SCO ou si les temps d'établissement sur, l'application doit appeler stopBluetoothSco() pour effacer la demande et baissez la connexion Bluetooth .

Même si une connexion SCO est établie, les restrictions suivantes sur la sortie audio flux afin qu'ils puissent être acheminés vers casque SCO: - le type de flux doit être STREAM_VOICE_CALL - le format doit être mono - l'échantillonnage doit être 16kHz ou 8kHz

les restrictions suivantes sur flux d'entrée: - le format doit être mono - l'échantillonnage doit être

8kHz

Notez que l'application téléphonique a toujours la priorité sur l'utilisation de la connexion SCO pour la téléphonie. Si cette méthode est appelée alors que le téléphone est en , l'appel sera ignoré. De même, si un appel est reçu ou envoyé, alors qu'une application utilise la connexion SCO , la connexion sera perdue pour l'application et pas retourné automatiquement lorsque l'appel se termine.

Voir aussi stopBluetoothSco() ACTION_SCO_AUDIO_STATE_CHANGED

Notez que je ne l'ai pas testé, je ne fais que passer le long d'une avance que j'ai trouvé dans la recherche d'un projet similaire. Je pense que Jayesh était proche de la solution et les restrictions ci-dessus ont pu être ce qui l'empêchait de fonctionner.

+0

Brillant! Merci :) – Force

+0

startBluetoothSco() et

+0

J'ai ajouté ce STREAM_VOICE_CALL mais dans certains de Samsung (Samsung S6) il fonctionne et sur d'autres il ne fonctionnera pas. Est-ce leur tout autre mode pour enregistrer la voix à partir du mode Bluetooth pour tous les appareils. J'ai aussi essayé avec MODE_IN_COMMUNICATION. –

5

Pour activer:

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

Pour désactiver:

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

I took it from here

3

Grand Œuvre, il fonctionne très bien pour moi s'il vous plaît faire une modification de bit dans votre code que ça va marcher parfaitement

mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

to 

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
+1

Merci Aditya, excellent travail ... –

0

Impossible de voir une application de travail clairement acceptée afin de mettre une nouvelle réponse. Cette application achemine la musique et l'audio vers des casques non A2dp. Essayez mon application et trouvez le code source également dans github pour le code de référence.https://github.com/sauravpradhan/AnySound2BT