2010-01-27 17 views
38

Possiedo un auricolare BT auricolare monoauricolare A2DP (Plantronics 510) e vorrei utilizzarlo con il mio HTC Magic Android per ascoltare audio di bassa qualità come podcast/audio libri.Instradamento audio su auricolare Bluetooth (non-A2DP) su Android

Dopo aver cercato su Google ho scoperto che solo l'audio della telefonata può essere indirizzato agli auricolari BT non A2DP. (Vorrei sapere se avete trovato una soluzione pronta per indirizzare tutti i tipi di audio a cuffie BT non A2DP)

Quindi ho pensato, in qualche modo, a livello di codice, di canalizzare l'audio allo streaming che trasporta l'audio della telefonata. In questo modo ingannerò il telefono per trasportare il mio audio mp3 sul mio auricolare BT. Ho scritto seguendo il semplice codice.

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

Come potete vedere ho provato combinazioni di vari metodi che ho pensato che ingannerà il telefono a credere il mio audio è una telefonata:

  • Utilizzando setAudioStreamType di MediaPlayer (STREAM_VOICE_CALL)
  • usando AudioManager di setBluetoothScoOn (vero)
  • usando setMode di AudioManager (MODE_IN_CALL)

Ma nessuno dei precedenti ha funzionato. Se rimuovo le chiamate di AudioManager nel codice sopra, l'audio viene riprodotto dagli altoparlanti e se li sostituisco come mostrato sopra, l'audio si interrompe provenire dagli altoparlanti, ma non passa attraverso l'auricolare BT. Quindi questo potrebbe essere un successo parziale.

Ho verificato che l'auricolare BT funzioni bene con le chiamate telefoniche.

Ci deve essere un motivo per Android che non supporta questo. Ma non posso lasciare andare la sensazione che non sia possibile reindirizzare l'audio a livello di programmazione. Qualche idea?

P.S. sopra codice deve seguente autorizzazione

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

+0

Potrebbe non essere necessario scrivere alcun codice autonomamente. Basta installare un'app gratuita progettata per fare ciò che vuoi. Vedi la domanda Android.SE: ["È possibile indirizzare tutta l'uscita audio, inclusa l'uscita della musica, a un auricolare Bluetooth?"] (Http://android.stackexchange.com/questions/19336/is-it-possible- to-direct-all-audio-output-to-a-a-bluetooth-headset) Ho provato alcune app diverse. Alla fine, "Mono Bluetooth Router" è stato l'unico che ha funzionato per me. – unforgettableid

risposta

2

Ci dovrebbe essere un percorso percorso ALSA configurato per il lettore multimediale, in modo che possa aprire un percorso audio diverso e quindi percorso l'audio per auricolare BT.

13

Questo thread potrebbe essere lungo dead ma per coloro che potrebbero provare la stessa cosa, alcune note dai documenti AudioManager possono essere utili. Sembra che l'elemento mancante sia il comando startBluetoothSco() ma esistono limitazioni sull'uso di questo canale. Dal sito Dev Android here:

public void startBluetoothSco() Dal: API Livello 8 Inizio bluetooth SCO collegamento audio.

Richiede l'autorizzazione: MODIFY_AUDIO_SETTINGS.

Questo metodo può essere utilizzato da applicazioni che vogliono inviare e ricevuto l'audio da/verso un bluetooth SCO auricolare mentre il telefono non è in chiamata.

Come la creazione del collegamento SCO può richiedere diversi secondi, le applicazioni non devono fare affidamento sulla connessione ad essere disponibile quando il metodo restituisce ma invece registrarsi per ricevere la intento ACTION_SCO_AUDIO_STATE_CHANGED e aspettare che lo Stato sia SCO_AUDIO_STATE_CONNECTED.

Poiché la connessione non è garantita per riuscita, le applicazioni devono attendere questo intento con un timeout.

Al termine con la connessione SCO o se i tempi stabilimento fuori, l'applicazione deve chiamare stopBluetoothSco() per cancellare la richiesta e abbassare il bluetooth connessione.

Anche se una connessione SCO è stabilito, le seguenti restrizioni si applicano in uscita audio flussi in modo che possano essere indirizzati a auricolare SCO: - il tipo di flusso deve essere STREAM_VOICE_CALL - il formato deve essere mono - il campionamento deve essere 16kHz o 8kHz

le seguenti limitazioni sulla flussi di input: - il formato deve essere mono - il campionamento deve 8kHz

Si noti che l'applicazione telefono sempre ha la priorità sull'utilizzo della connessione SCO per la telefonia. Se questo metodo viene chiamato mentre il telefono è in , la chiamata verrà ignorata. Allo stesso modo, se si riceve una chiamata o inviato mentre un'applicazione utilizza la connessione SCO , la connessione sarà perso per l'applicazione e NON restituito automaticamente quando la chiamata estremità.

Vedere anche stopBluetoothSco() ACTION_SCO_AUDIO_STATE_CHANGED

Si noti che non ho ancora testato questo, sto solo passando lungo un vantaggio che ho trovato nella ricerca di un progetto simile. Penso che Jayesh fosse vicino alla soluzione e le restrizioni sopra potrebbero essere ciò che gli impediva di funzionare.

+0

Brillante! Grazie :) – Force

+0

startBluetoothSco() e

+0

Ho aggiunto questo STREAM_VOICE_CALL ma in alcuni dispositivi Samsung (Samsung S6) funziona e su altri non funzionerà. È loro qualsiasi altra modalità per registrare la voce dalla modalità bluetooth per tutti i dispositivi. Ho anche provato con MODE_IN_COMMUNICATION. –

5

Per attivare:

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

Per spegnere:

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

I took it from here

3

Grande Opera si sta lavorando bene per me si prega di fare modifiche po 'nel codice che funzionerà perfettamente ie

mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

to 

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
+1

Grazie Aditya, ottimo lavoro ... –

0

Impossibile visualizzare un'applicazione di lavoro accettata e chiara, quindi inserire una nuova risposta. Questa applicazione indirizza musica e audio verso cuffie non A2dp. Prova la mia applicazione e trova il codice sorgente anche in github per il codice di riferimento.https://github.com/sauravpradhan/AnySound2BT

Problemi correlati