web-dev-qa-db-fra.com

Comment lire de l'audio via le haut-parleur Bluetooth même lorsque le casque est branché?

Mon téléphone est connecté à un haut-parleur Bluetooth et le casque est branché. J'aimerais maintenant lire le son via le haut-parleur Bluetooth . Lorsque je règle le flux audio sur AudioManager.STREAM_MUSIC, il lit uniquement le casque.

Peu importe qu’il joue également au casque, mais j’en ai besoin pour jouer sur le haut-parleur Bluetooth.

Comment est-ce possible? L'application SoundAbout réussit à le faire, alors il doit y avoir un moyen.

EDIT: lorsque je branche le casque et que je ne connecte ensuite que les haut-parleurs Bluetooth, tout l'audio est lu par le biais des haut-parleurs Bluetooth souhaités. Mais je ne peux pas m'attendre à ce que l'utilisateur le découvre et avant de devoir leur montrer un message compliqué, je préférerais trouver un moyen de faire en sorte que le son soit toujours reproduit par les enceintes BT lorsqu’il est connecté à certaines.

Merci

(Notez que ce n’est pas la même question que celle-ci: Comment lire un fichier audio par le haut-parleur même lorsque le casque est branché? Je souhaite le lire sur les haut-parleurs Bluetooth et non sur le haut-parleur intégré du téléphone.)

10
DominicM

Solution

Supposons que vous ayez déjà testé STREAM_RING sur votre nouvelle instance de lecteur multimédia et que vous n'ayez pas défini directement le type de flux, et que cela n'a pas fonctionné. Vous avez besoin d'un profil correct pour votre périphérique Bluetooth.

Jetez un oeil à cet article Lisez la section "Mise en oeuvre de HAL", il y a beaucoup de sources pour différents profils que vous pourrez peut-être utiliser.

Il existe également une solution simple qui consiste à modifier le profil de votre périphérique en HEADSET dans votre méthode getServiceConnected (). Il deviendra un périphérique Restez connecté, mais la sortie deviendra mono! Si je me souviens bien, ce qui est une honte pour les haut-parleurs, A2DP peut également ne pas être pris en charge par certains matériels et être interrompu par des casques filaires.

Je suggère de créer un nouveau profil et de l'utiliser, ce qui est un peu compliqué avec HAL, mais cela en vaudra la peine,

Désolé, je ne peux pas vous fournir de code source pour le moment.

6
Zich

La connexion Bluetooth peut fonctionner si l'état ci-dessous est vrai . Après avoir reçu BluetoothA2dp.STATE_CONNECTED, vous pouvez lire de la musique normalement.

Exemples de code Java pour Android.bluetooth.BluetoothA2dp.STATE_CONNECTED

public BluetoothHandsfree(Context context, CallManager cm) {
    mCM = cm;
    mContext = context;
    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
    boolean bluetoothCapable = (adapter != null);
    mHeadset = null;  // nothing connected yet
    mA2dp = new BluetoothA2dp(mContext);
    mA2dpState = BluetoothA2dp.STATE_DISCONNECTED;
    mA2dpDevice = null;
    mA2dpSuspended = false;

    mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    mStartCallWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                                   TAG + ":StartCall");
    mStartCallWakeLock.setReferenceCounted(false);
    mStartVoiceRecognitionWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                                   TAG + ":VoiceRecognition");
    mStartVoiceRecognitionWakeLock.setReferenceCounted(false);

    mLocalBrsf = BRSF_AG_THREE_WAY_CALLING |
                 BRSF_AG_EC_NR |
                 BRSF_AG_REJECT_CALL |
                 BRSF_AG_ENHANCED_CALL_STATUS;

    if (sVoiceCommandIntent == null) {
        sVoiceCommandIntent = new Intent(Intent.ACTION_VOICE_COMMAND);
        sVoiceCommandIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
    if (mContext.getPackageManager().resolveActivity(sVoiceCommandIntent, 0) != null &&
            BluetoothHeadset.isBluetoothVoiceDialingEnabled(mContext)) {
        mLocalBrsf |= BRSF_AG_VOICE_RECOG;
    }

    mBluetoothPhoneState = new BluetoothPhoneState();
    mUserWantsAudio = true;
    mPhonebook = new BluetoothAtPhonebook(mContext, this);
    mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    cdmaSetSecondCallState(false);

    if (bluetoothCapable) {
        resetAtState();
    }

}

veuillez trouver ci-dessous des liens: avec des exemples de codes, cela peut vous aider.

Exemples de code Java pour Android.bluetooth.BluetoothHeadset

Connectez par programme à un haut-parleur Bluetooth couplé et lisez de l'audio

2
Chetan Joshi

Si vous avez votre logique de routage dans votre application, vous pouvez alors décider de la sortie audio à lire.

J'ai une application de test écrite dans le but exact. Mon lien Github

Vous pouvez également router les fichiers audio à votre guise en fonction des besoins. Vous pouvez consulter ce lien github pour le routage

2
Saurav

Vous devez instancier un nouvel objet de la classe MediaPlayer et utiliser la méthode suivante.

 amediaplayer.setAudioStreamType(AudioManager.STREAM_RING)

N'oubliez pas de vérifier l'autorisation d'utiliser Bluetooth, vous ne pouvez rien envoyer au haut-parleur via Bluetooth sans les privilèges de l'utilisateur, comme vous le savez.

1
Rassam

Audiomanager annule et achemine l'audio vers le dernier périphérique connecté (un casque filaire ou un casque Bluetooth). Sous Android, nous n'avons aucune option pour remplacer ce paramètre, à moins qu'il s'agisse d'une application système et acheminer l'audio partout où nous voulons acheminer. Cependant, vous pouvez utiliser des apis de réflexion et remplacer ce paramètre. Audiomanager suspend la route de connexion Bluetooth (si déjà connecté) si un casque filaire est connecté et vice versa. Vous pouvez regarder le code ici

Par conséquent, en utilisant des apis de réflexion, vous pouvez basculer une route audio Bluetooth en invoquant cette méthode .

0
7383