2015-01-15 27 views
17

Ai đó có thể giúp tôi sử dụng TTS với API 21. Tất cả các ví dụ có sẵn đang bị phản đối với phiên bản 21TextToSpeech với API 21

Dưới đây là mã của tôi đưa ra lỗi trên dòng cuối cùng:

Calendar cal = Calendar.getInstance(); 
        cal.getTime(); 
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
        String text = sdf.toString(); 
        btn.setText("Ouvir as Horas"); 

        TextToSpeech tts = new TextToSpeech(NightClock.this,(TextToSpeech.OnInitListener) NightClock.this); 
        tts.setLanguage(Locale.US); 
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); 

Trong nhà phát triển Android nó nói rằng phương pháp này không được chấp nhận và được thay thế bằng cách này:

nói (Chuỗi văn bản, hàng đợi intMode, thông số HashMap) Phương pháp này không còn được dùng trong API leve l 21. Như của API cấp 21, thay thế bằng cách nói (CharSequence, int, Bundle, String).

Ai đó có thể giúp mã ứng dụng của tôi.

Trả lời

0

Hãy thử điều này

tts=new TextToSpeech(getBaseContext(),new TextToSpeech.OnInitListener() 
{  
     @Override   
     public void onInit(int status) 
     { 
      tts.setLanguage(Locale.getDefault()); 
      tts.setPitch(1.3f); 
      tts.setSpeechRate(1f); 
     } 
}); 
+0

điều này hơi khó hiểu đối với tôi. Tôi đã thử nhiều cách nhưng tất cả đều có lỗi. Đối với dòng mà nó cho lỗi này: "nói (CharSequence văn bản, int queueMode, Bundle params, String utteranceId)" Đó là những gì Android Studio đề nghị. Tôi là một newbie Tôi không biết làm thế nào tôi có thể điền vào các lĩnh vực. –

+0

Khởi tạo Văn bản thành lời nói ở trên cùng như trong câu trả lời của tôi – Aditya

+0

tts.speak (tv3.getText(). ToString(), TextToSpeech.QUEUE_FLUSH, null); tv là chế độ xem văn bản hoặc bạn có thể sử dụng một dòng là – Aditya

6
tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null); 

Hãy thử điều này.

+0

Không hoạt động, treo ứng dụng. –

+0

Vâng, sau khi xây dựng ứng dụng, Android Studio báo cáo rằng, cú pháp đó chỉ có sẵn cho API 21. Vì vậy, có thể nó hoạt động nhưng thiết bị của tôi không phải là Lollipop Tôi không thể kiểm tra nó. Vấn đề sau đó là làm thế nào để tạo ra một ứng dụng TextToSpeech tương thích với api 20 và api 21. –

+0

sử dụng phương pháp không dùng nữa cho cả hai và thử ứng dụng chạy trong trình mô phỏng nó hiển thị như thế nào – Aditya

5

Vì vậy, tôi đoán đây là lừa:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    tts.speak("12 e8", TextToSpeech.QUEUE_FLUSH, null, null); 
    } 
else { 
    tts.speak("12 e8", TextToSpeech.QUEUE_FLUSH, null); 
    } 

Tôi chỉ cần kiểm tra điều này trên giả lập.

Nhân tiện, @Aditya vì bạn đã rất hữu ích nên tôi đã bị mắc kẹt trong cùng một dự án nơi mà nó nên nói rằng TextToSpeech và bật màn hình nhưng tôi chưa quản lý bật màn hình. Tôi đã cố gắng sử dụng wakelocks và cờ từ tất cả các ví dụ tôi đã tìm thấy :) Điều này được thực hiện máng cảm biến tiệm cận mà tôi quản lý để làm việc. Nó nói văn bản nhưng không hiển thị màn hình. Bạn có thể giúp tôi về điều này?

Thực hành tốt là chìa khóa thành công. Tất cả các câu trả lời được đề xuất bởi tôi là hoàn toàn làm việc trong IDE nhật thực của tôi. Giải pháp khóa màn hình của bạn là dưới

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); wl.acquire(); ..screen will stay on during this section.. wl.release();

+6

Thay vì điều kiện hiện tại của bạn, bạn nên sử dụng 'if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP) {...} else {...}' – EpicPandaForce

+0

Tốt nhất. Cảm ơn! –

0

Các wakelock, tôi quản lý để làm cho công việc ti theo cách này:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | 
            PowerManager.ON_AFTER_RELEASE, "MyWakelock"); 

wl.aquire(); 
wl.release(); 
39

Tôi đã tìm kiếm trang web khác nhau. Cuối cùng, tôi nghĩ rằng tôi có thể nhận được câu trả lời cho Câu hỏi của bạn ...

Thay vì gọi trực tiếp tts.speak(), hãy đặt câu lệnh if-else sau.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    ttsGreater21(text); 
} else { 
    ttsUnder20(text); 
} 

Sau đó khai báo ttsGreater21() và ttsUnder20() như sau.

@SuppressWarnings("deprecation") 
private void ttsUnder20(String text) { 
    HashMap<String, String> map = new HashMap<>(); 
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId"); 
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, map); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private void ttsGreater21(String text) { 
    String utteranceId=this.hashCode() + ""; 
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId); 
} 

Tôi đã xác nhận mã trên với Genymotion VM Android 5.0 và Android 4.4.4.

+0

Điều này thực sự hiệu quả! –

2

(1) hoạt động của tôi thực hiện TextToSpeech.OnInitListener

(2) tôi chơi bài phát biểu tổng hợp của tôi trong phương pháp OnInit, nhưng tôi giả sử (không thử nó), bạn có thể chơi bất cứ lúc nào sau khi OnInit () được gọi là. Nhưng đây là chìa khóa, bạn phải đợi cho công cụ TextToSpeech khởi tạo.

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener { 
    public TextToSpeech mTTS; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mTTS = new TextToSpeech(this, this); 
    } 

    @Override 
    public void onInit(int i) { 
     mTTS.setLanguage(Locale.UK); 
     mTTS.speak("Hello, how are you?", TextToSpeech.QUEUE_ADD, null, null); 
    }  
} 
Các vấn đề liên quan