it-swarm.com.de

Wie kann ich Audio über den Bluetooth-Lautsprecher abspielen, auch wenn das Headset angeschlossen ist?

Ich habe mein Telefon an einen Bluetooth-Lautsprecher angeschlossen und die Kopfhörer angeschlossen. Jetzt möchte ich Audio über den Bluetooth-Lautsprecher wiedergeben ... Wenn ich den Audiostream auf AudioManager.STREAM_MUSIC stelle, wird er einfach über den Kopfhörer abgespielt.

Es spielt keine Rolle, ob es auch über die Kopfhörer abgespielt wird, aber ich brauche es, um auf dem Bluetooth-Lautsprecher zu spielen.

Wie ist das möglich? Die App SoundAbout schafft dies, also muss es einen Weg geben.

BEARBEITEN: Wenn ich den Kopfhörer anschließe und erst danach eine Verbindung zu den Bluetooth-Lautsprechern herstelle, wird der gesamte Ton über die Bluetooth-Lautsprecher abgespielt, die ich möchte. Aber ich kann nicht erwarten, dass der Benutzer dies herausfindet Bevor ich ihnen eine komplizierte Nachricht zeigen muss, möchte ich lieber herausfinden, wie der Ton immer über BT-Lautsprecher abgespielt wird, wenn er an einige angeschlossen ist.

Vielen Dank

(Beachten Sie, dass dies nicht die gleiche Frage wie diese ist: Wie kann ich Audio auch über den Lautsprecher wiedergeben, wenn das Headset angeschlossen ist? Ich möchte, dass es über Bluetooth-Lautsprecher und nicht über den integrierten Lautsprecher des Telefons abgespielt wird.)

10
DominicM

Lösung

Angenommen, Sie haben STREAM_RING bereits für Ihre neue Instanz von Media Player getestet und den Stream-Typ nicht direkt festgelegt, und es hat nicht funktioniert. Sie benötigen ein korrektes Profil für Ihr Bluetooth-Gerät.

Werfen Sie einen Blick auf diesen Artikel Lesen Sie den Abschnitt "Implementierende HAL", es gibt viele Quellen für verschiedene Profile, die Sie möglicherweise verwenden können.

Es gibt auch eine einfache Lösung, um Ihr Geräteprofil in HEADSET in Ihrer getServiceConnected () - Methode zu ändern. Es wird zu einem Stay Connected Device, aber der Ausgang wird mono! Soweit ich mich erinnere, was für Lautsprecher eine Schande ist, wird A2DP in einigen Hardwares möglicherweise nicht unterstützt und dennoch durch Drahtkopfhörer unterbrochen.

Ich schlage vor, ein neues Profil zu erstellen und es zu verwenden, etwas schwieriger mit HAL zu arbeiten, aber es lohnt sich,

Sorry, dass ich momentan keinen Quellcode für Sie bereitstellen kann.

6
Zich

Möglicherweise funktioniert die Bluetooth-Verbindung unter dem Status true . Nach dem Empfang von BluetoothA2dp.STATE_CONNECTED können Sie Musik normal abspielen.

Java-Codebeispiele für 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();
    }

}

hier finden Sie Links: Mit Beispielcodes kann es Ihnen helfen.

Java Codebeispiele für Android.bluetooth.BluetoothHeadset

Programmgesteuert mit einem gekoppelten Bluetooth-Lautsprecher verbinden und Audio abspielen

2
Chetan Joshi

Wenn Sie Ihre Routing-Logik in Ihrer Anwendung haben, können Sie auf dieser Grundlage entscheiden, auf welchem ​​Ausgang das Audio abgespielt werden soll.

Ich habe eine Test-App, die genau für diesen Zweck geschrieben wurde. Mein Github Link

Sie können Audio je nach Anforderung auch nach Belieben routen . Sie können diesen github-Link für das Routing verwenden.

2
Saurav

Sie müssen ein neues Objekt der Klasse MediaPlayer instanziieren und die folgende Methode darauf anwenden

 amediaplayer.setAudioStreamType(AudioManager.STREAM_RING)

Vergessen Sie nicht, die Berechtigung zur Verwendung von Bluetooth zu überprüfen. Sie können nichts über Bluetooth an den Lautsprecher senden, wenn Sie nicht über ein Benutzerrecht verfügen.

1
Rassam

Audiomanager überschreibt und leitet Audio an das zuletzt verbundene Gerät weiter (entweder ein kabelgebundenes Headset oder ein Bluetooth-Headset). In Android haben wir keine Option, um diese Einstellung außer Kraft zu setzen, es sei denn, es handelt sich um eine System-App, und das Audio wird dorthin geleitet, wo wir routen möchten. Sie können Reflection-Apis jedoch verwenden und diese Einstellung überschreiben. Audiomanager unterbricht die Bluetooth-Verbindungsroute (falls bereits verbunden), wenn ein kabelgebundenes Headset angeschlossen ist, und umgekehrt. Sie können den Code hier ansehen. 

Mit Hilfe von Reflection-Apis können Sie die Bluetooth-Audioroute durch Aufrufen dieser Methode umschalten.

0
7383