2011-08-05 17 views
5

Androidem samouczka stany, które mogę jednoznacznie powiedzieć TTS, który strumień używać:TTS wyjście zawsze będzie A2DP

do odtwarzania muzyki:

params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); 

a dla połączeń telefonicznych:

params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL)); 

Rozumiem, że kierowanie audio do zestawu słuchawkowego Bluetooth działa tak, że STREAM_MUSIC przechodzi do A2DP (inaczej "audio multimediów" w ustawieniach Androida Bluetooth) i STREAM_VOICE_CALL przechodzi do HSP (inaczej "dźwięk telefonu" w ustawieniach Androida Bluetooth).

Ale niezależnie czy używam STREAM_MUSIC lub STREAM_VOICE_CALL w moim małym aplikacji audio zawsze idzie z jakiegoś powodu do A2DP.

Co robię źle? Czy istnieje sposób na przekierowanie wyjścia TTS do profilu zestawu słuchawkowego HSP?

Odpowiedz

2

mam to działa w przeważającej części, na większości urządzeń. Oto część, która uruchamia TTS w strumieniu połączeń głosowych za pomocą Bluetooth SCO zamiast A2DP.

if (mTtsReady) { 
    myHash = new HashMap<String, String>(); 

    myHash.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "A2DP_Vol"); 

    OLD_AUDIO_MODE = am2.getMode(); 
    if(SMSstream == 1){ 
     if (am2.isBluetoothScoAvailableOffCall()) { 
      am2.startBluetoothSco(); 
     } 
     if(!am2.isSpeakerphoneOn()){ 
      speakerPhoneWasOn = false; 
      am2.setSpeakerphoneOn(true); 
     } 
     myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM, 
       String.valueOf(AudioManager.STREAM_VOICE_CALL)); 
     am2.requestAudioFocus(null, AudioManager.STREAM_VOICE_CALL, 
       AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 

    } 
    else{ 
     am2.requestAudioFocus(null, AudioManager.STREAM_MUSIC, 
     AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 
     myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM, 
       String.valueOf(AudioManager.STREAM_MUSIC)); 
    } 

    new CountDownTimer(SMS_DELAY, SMS_DELAY/2) { 

     @Override 
     public void onFinish() { 
      try { 
       mTts.speak(str, TextToSpeech.QUEUE_ADD, 
         myHash); 
      } catch (Exception e) { 
       Toast.makeText(application, 
         R.string.TTSNotReady, 
         Toast.LENGTH_LONG).show(); 
       e.printStackTrace(); 
      } 

     } 

     @Override 
     public void onTick(long arg0) { 

     } 

    }.start(); 
} 

Teraz po prostu mam problem z odzyskaniem strumienia po zakończeniu. Wszystko działa dobrze, aby przeczytać TTS. Przerywa odtwarzanie dowolnej muzyki, odtwarza TTS, a następnie wznawia odtwarzanie muzyki. Jednak po zamknięciu aplikacji strumień multimediów jest odtwarzany przez słuchawkę telefonu, dopóki nie uruchomię ponownie. Zamieściłem to pytanie tutaj: Audio stream stays on earpiece after using AudioManager

Można zobaczyć cały mój projekt tutaj: http://code.google.com/p/a2dpvolume/

+0

To jest niesamowite. Opłakane dzięki za umieszczenie tego. Akceptuję, mimo że nie testowałem jeszcze tego kodu w mojej aplikacji. – an00b

1

Jeśli twój zestaw słuchawkowy jest kompatybilny z profilem a2dp, to używanie go w trybie AudioManager.STREAM_MUSIC, a tym samym odtwarzanie dźwięku przez strumień, powinno zostać wykonane.

Dodam też, że jeśli obecnie prowadzisz rozmowę i odtwarzasz dźwięk za pośrednictwem strumienia głosu, to każdy zestaw słuchawkowy (a2dp lub inny) może usłyszeć dźwięk. Niestety, musisz być w trakcie rozmowy. Niestety znalazłem, że ustawienie trybu na MODE_IN_CALL nic nie robi.

Podsumowując: Jeśli wszystko, co próbujesz zrobić, to odtwarzać muzykę (gdy nie jest w rozmowie), a następnie użyć AudioManager.STREAM_MUSIC, a jeśli zestaw słuchawkowy jest zgodny z A2DP, to usłyszy muzykę.

Również spojrzeć na AudioManager.isBluetoothA2dpOn(), aby upewnić się, że system myśli że headeset jest podłączony.

+0

Dzięki, ale może nie wyjaśniłem, co chcę zrobić bardzo dobrze: Chcę odtwarzać wyjście TTS (tekst na mowę) przez ** non ** A2DP. To znaczy, chciałbym móc korzystać z tańszych zestawów słuchawkowych do zamiany tekstu na mowę. W końcu to tylko głos, a nie muzyka hi-fi ... Czy to możliwe? +1 za próbę. – an00b

+0

Cóż, właściwie nie sądzę, że to jest możliwe, ponieważ musiałbyś zmienić sposób działania systemu, może być coś podobnego (Ty drapie moje plecy ...) pomiędzy firmami ... Ale nie jestem pewien – CornflakesDK

1

Tak możliwe jest odtwarzanie TTS (text-to-speech) Wyjście przez słuchawki non A2DP jak jroal mówi za pomocą SCO.

Skorzystaj z StartBluetoothSco aplikacji AudioManager, aby włączyć SCO. Następnie odsłuchaj audycję AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED przy ustawieniu EXTRA_SCO_AUDIO_STATE na SCO_AUDIO_STATE_CONNECTED.

Jeśli teraz zrobisz TextToSpeech do strumienia STREAM_VOICE_CALL, to skończy się w zestawie słuchawkowym (nawet tanie urządzenia non A2DP).

Powiązane problemy