2010-01-27 2 views
38

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

Nach viel googlen fand ich, dass nur Telefonanruf Audio zu den Nicht-A2DP BT Headsets geroutet werden kann. (Ich würde gerne wissen, ob Sie eine fertige Lösung gefunden haben, um alle Arten von Audio auf Nicht-A2DP-BT-Headsets zu routen)

So dachte ich, irgendwie programmgesteuert kann ich das Audio auf den Stream, 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 habe ich versucht, Kombinationen verschiedener Methoden sehen, dass ich dachte, das Telefon zu täuschen meine Audio ist ein Telefonanruf zu glauben:

  • Mit Mediaplayer des setAudioStreamType (STREAM_VOICE_CALL)
  • mit Audio-Manager des setBluetoothScoOn (true)
  • mit Audio-Manager des setMode (MODE_IN_CALL)

Aber keiner der oben genannten funktioniert. 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, dass das BT Headset mit 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?

P.S. oben braucht Code Erlaubnis folgende

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

+0

Sie müssen möglicherweise keinen Code selbst schreiben. Installieren Sie einfach eine kostenlose App, die entwickelt wurde, um zu tun, was Sie wollen. Weitere Informationen finden Sie in der Android.SE-Frage: ["Ist es möglich, die gesamte Audioausgabe einschließlich Musikausgabe an ein Bluetooth-Headset zu senden?"] (Http://android.stackexchange.com/questions/19336/is-it-possible- to-direct-all-audio-output-to-a-bluetooth-headset) Ich habe ein paar verschiedene Apps ausprobiert. Am Ende war "Mono Bluetooth Router" der einzige, der für mich funktionierte. – unforgettableid

Antwort

2

Es sollte ein ALSA Routenweg für Media-Player-konfiguriert sein, so dass es einen anderen Audio-Pfad und Ihre Audio-BT-Headset dann Route öffnen.

13

Dieser Thread ist möglicherweise lange tot, aber für diejenigen, die das gleiche versuchen könnten, können einige Notizen aus der AudioManager-Dokumentation nützlich sein. Es sieht so aus, als ob das fehlende Element der startBluetoothSco() -Befehl ist, aber es gibt Einschränkungen bei der Verwendung dieses Kanals. Vom Android Dev Website here:

public void startBluetoothSco() Seit: API-Ebene 8 Start Bluetooth SCO Audioverbindung.

Erfordert Berechtigung: MODIFY_AUDIO_SETTINGS.

Diese Methode kann durch Anwendungen verwendet werden wollen Audio senden und zu empfangen zu/von einem Bluetooth-SCO Headset, während das Telefon nicht in Anruf ist.

Als SCO Verbindungsaufbau kann einige Sekunden dauern, Anwendungen sollten nicht auf die Verbindung zu verlassen verfügbar sein, wenn das Verfahren gibt, sondern registrieren die Absicht ACTION_SCO_AUDIO_STATE_CHANGED und warten zu erhalten für den Staat zu sein SCO_AUDIO_STATE_CONNECTED.

Da die Verbindung nicht garantiert erfolgreich ist, müssen Anwendungen warten auf diese Absicht mit einem Timeout.

Wenn es mit der SCO-Verbindung oder wenn die Einrichtung einer Zeitüberschreitung beendet, die Anwendung muss stopBluetoothSco() rufen Sie die Anfrage zu löschen und die Bluetooth-Verbindung ausschlagen.

Selbst wenn eine SCO-Verbindung hergestellt ist, gelten die folgenden Beschränkungen für Audio-Ausgang Ströme, so dass sie zu Headset SCO geroutet werden können: - der Stromtyp STREAM_VOICE_CALL sein muss - das Format mono sein muss - die Abtastung 16kHz 8kHz sein muss oder

gelten die folgenden Einschränkungen auf Eingangsströme: - das Format mono sein muß - die Probennahme muß 8kHz

sein

Beachten Sie, dass die Telefonanwendung immer die Priorität auf der Verwendung der SCO-Verbindung für Telefonie hat. Wenn diese Methode aufgerufen wird, während sich das Telefon in befindet, wird es ignoriert. Und falls ein Anruf eingeht oder gesendet werden, während eine Anwendung wird die SCO -Verbindung, wird die Verbindung für die Anmeldung und nicht zurück automatisch, wenn der Anruf endet.

Siehe auch stopBluetoothSco() ACTION_SCO_AUDIO_STATE_CHANGED

Bitte beachten, dass ich dies nicht getestet, ich bin an der Leine nur auf dem Durch ich bei der Recherche ein ähnliches Projekt gefunden. Ich denke, Jayesh war der Lösung nahe und die oben genannten Einschränkungen waren möglicherweise das, was sie davon abhielt zu arbeiten.

+0

Brilliant! Danke :) – Force

+0

startBluetoothSco() und

+0

Ich habe diese STREAM_VOICE_CALL hinzugefügt, aber in einigen Samsung Geräten (Samsung S6) funktioniert es und auf anderen wird es nicht funktionieren. Ist ihr anderer Modus, um die Stimme aus dem Bluetooth-Modus für alle Geräte aufzunehmen. Ich habe es auch mit MODE_IN_COMMUNICATION versucht. –

5

Zum Einschalten:

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

auszuschalten:

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

I took it from here

3

Große Arbeit es funktioniert gut für mich bitte Bitmodifikation im Code tun wird es funktionieren perfekt zB

mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

to 

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
+1

Danke Aditya, Tolle Arbeit ... –

0

Kann eine klar akzeptierte funktionierende Anwendung nicht sehen, also eine neue Antwort geben. Diese Anwendung leitet Musik und Audio zu Nicht-A2DP-Headsets. Probieren Sie meine Anwendung und finden Sie den Quellcode auch in Github für Referenzcode.https://github.com/sauravpradhan/AnySound2BT