2011-08-05 39 views
5

bang hướng dẫn Android của tôi rằng tôi có thể nói một cách rõ ràng động cơ TTS mà dòng sử dụng:TTS đầu ra luôn luôn A2DP

Đối với phát lại âm nhạc:

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

Và đối với các cuộc gọi điện thoại:

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

Sự hiểu biết của tôi là định tuyến âm thanh đến tai nghe Bluetooth hoạt động sao cho STREAM_MUSIC chuyển đến A2DP (còn gọi là "âm thanh phương tiện" trong cài đặt Android Bluetooth) và STREAM_VOICE_CALL chuyển đến HSP (còn gọi là "âm thanh điện thoại" trong cài đặt Android Bluetooth).

Nhưng bất kể tôi sử dụng STREAM_MUSIC hoặc STREAM_VOICE_CALL trong ứng dụng nhỏ của tôi, âm thanh luôn đi vì một lý do để A2DP.

Tôi đang làm gì sai? Có cách nào để định tuyến đầu ra TTS tới cấu hình HSP của tai nghe không?

Trả lời

2

. Tôi đã làm việc này đối với hầu hết các phần, trên hầu hết các thiết bị này. Đây là phần bắt đầu TTS trên luồng cuộc gọi thoại bằng Bluetooth SCO thay vì 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(); 
} 

Bây giờ, tôi gặp sự cố khi luồng được hoàn nguyên trở lại khi hoàn tất. Tất cả đều hoạt động tốt để đọc TTS. Nó sẽ tạm dừng bất kỳ nhạc nào, phát TTS, và sau đó tiếp tục nhạc tốt. Tuy nhiên, khi tôi thoát khỏi ứng dụng, luồng truyền thông hiện đang phát qua tai nghe điện thoại cho đến khi tôi khởi động lại. Tôi gửi câu hỏi ở đây: Audio stream stays on earpiece after using AudioManager

Bạn có thể thấy toàn bộ dự án của tôi ở đây: http://code.google.com/p/a2dpvolume/

+0

Điều này thật phi thường. Cảm ơn bạn đã gửi bài đăng này. Chấp nhận, mặc dù tôi chưa thử nghiệm mã này trong ứng dụng của mình. – an00b

1

Nếu tai nghe của bạn tương thích với cấu hình a2dp, sau đó sử dụng AudioManager.STREAM_MUSIC và do đó phát âm thanh qua luồng sẽ hoàn thành công việc.

Tôi cũng sẽ thêm, nếu bạn hiện đang trong cuộc gọi và bạn phát âm thanh qua luồng thoại thì mọi tai nghe (a2dp hoặc cách khác) đều có thể nghe thấy âm thanh. Thật không may, bạn cần phải có một cuộc gọi. Rất tiếc, tôi thấy rằng việc đặt chế độ thành MODE_IN_CALL sẽ không làm gì cả.

Để tổng hợp: Nếu tất cả những gì bạn đang cố gắng thực hiện là phát nhạc (khi không có cuộc gọi), hãy sử dụng AudioManager.STREAM_MUSIC và nếu tai nghe tương thích với A2DP thì sẽ nghe nhạc.

Ngoài ra, hãy nhìn vào AudioManager.isBluetoothA2dpOn(), để đảm bảo rằng hệ thống nghĩ rằng headeset của bạn đã được cắm vào

+0

Cảm ơn nhưng tôi có thể đã không giải thích những gì tôi muốn làm rất tốt: Tôi muốn phát đầu ra TTS (text-to-speech) thông qua tai nghe ** không ** A2DP. Đó là, tôi muốn có thể sử dụng tai nghe rẻ tiền hơn cho văn bản thành giọng nói. Xét cho cùng, đó chỉ là giọng nói, chứ không phải âm nhạc hi-fi ... Có thể không? 1 cho nỗ lực. – an00b

+0

Tôi thực sự không nghĩ rằng nó có thể, vì bạn phải thay đổi cách hệ thống hoạt động, có thể là một cái gì đó bout (Bạn gãi lưng của tôi ...) giữa các công ty ... Nhưng tôi không chắc chắn – CornflakesDK

1

Có nó có thể chơi TTS (text-to-speech) đầu ra thông qua một tai nghe A2DP phi như jroal nói bằng cách sử dụng SCO.

Sử dụng AudioManager startBluetoothSco để bật SCO. Sau đó nghe AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED phát sóng với EXTRA_SCO_AUDIO_STATE được đặt thành SCO_AUDIO_STATE_CONNECTED.

Nếu bây giờ bạn làm TextToSpeech với luồng STREAM_VOICE_CALL, nó sẽ kết thúc trong tai nghe (ngay cả các thiết bị không có giá rẻ A2DP).

Các vấn đề liên quan