Routing von Audio zu Bluetooth Headset (nicht-A2DP) auf Android



1 Answers

Zum Einschalten:

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

Ausschalten:

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

Ich habe es von hier genommen

Question

Ich habe ein nicht-A2DP Single-Ohr-BT-Headset (Plantronics 510) und möchte es mit meinem Android HTC Magic verwenden, um Audio niedriger Qualität wie Podcasts / Hörbücher zu hören.

Nach vielem Googeln habe ich festgestellt, dass nur Telefonanrufe zu den Nicht-A2DP-BT-Headsets geroutet werden können. (Ich würde gerne wissen, ob Sie eine fertige Lösung gefunden haben, um alle Arten von Audio an Nicht-A2DP-BT-Headsets zu leiten)

Also dachte ich, irgendwie programmgesteuert kann ich das Audio zu dem Stream channeln, der Telefonanruf-Audio trägt. Auf diese Weise täusche ich das Telefon, um meinen mp3-Ton zu meinem BT-Kopfhörer zu tragen. Ich habe folgenden einfachen Code geschrieben.

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

Wie Sie sehen können, habe ich verschiedene Kombinationen verschiedener Methoden ausprobiert, von denen ich dachte, dass sie das Telefon täuschen werden, um zu glauben, dass mein Audio ein Anruf ist:

  • Verwenden von MediaPlayer setAudioStreamType (STREAM_VOICE_CALL)
  • mit dem audioManager setBluetoothScoOn (true)
  • mit dem setMode von AudioManager (MODE_IN_CALL)

Aber keines der oben genannten funktionierte. Wenn ich die AudioManager-Aufrufe im obigen Code lösche, wird das Audiosignal über den Lautsprecher abgespielt und wenn ich es wie oben gezeigt ersetze, hört der Ton von den Lautsprechern auf, kommt aber nicht über das BT-Headset. Das könnte also ein Teilerfolg sein.

Ich habe überprüft, ob das BT-Headset bei Telefonanrufen in Ordnung ist.

Es muss einen Grund geben, warum Android dies nicht unterstützt. Aber ich kann das Gefühl nicht loslassen, dass es nicht möglich ist, das Audio programmatisch umzuleiten. Irgendwelche Ideen?

PS obigen Code benötigt folgende Erlaubnis

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




Es sollte ein ALSA-Routenpfad für den Media Player konfiguriert sein, damit er einen anderen Audiopfad öffnen und Ihr Audio an BT-Headset weiterleiten kann.




Related