带有API 21的TextToSpeech

时间:2015-01-15 16:26:06

标签: android api text-to-speech

有人可以帮我使用带有API 21的TTS吗? 所有可用的示例都不推荐使用版本21

这是我的代码在最后一行给出错误:

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

在Android开发人员中,它表示不推荐使用此方法,并将其替换为:

  

说(String text,int queueMode,HashMap params)   此方法在API级别21中已弃用。从API级别21开始,替换为speak(CharSequence,int,Bundle,String)。

有人可以帮我编写应用程序代码。

6 个答案:

答案 0 :(得分:41)

我搜索了各种网站。最后,我想我能得到你问题的答案......

直接调用tts.speak(),输入以下if-else语句。

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

然后按如下方式声明ttsGreater21()和ttsUnder20()。

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

我使用Genymotion VM Android 5.0和Android 4.4.4确认了上述代码。

答案 1 :(得分:5)

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

试试这个。

答案 2 :(得分:5)

所以我猜这就是诀窍:

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

我只需要在模拟器上测试它。

顺便说一下,@ Aditya,因为你一直很有帮助我被困在同一个项目中,它应该说TextToSpeech并打开屏幕,但我还没有设法转屏幕上。我试图使用我发现的所有例子中的唤醒锁和旗帜:)这是通过我设法工作的接近传感器完成的。它说文字但没有显示屏幕。你能帮我解决这个问题吗?

良好的实践是成功的关键。我所有建议的答案都完全适用于我的eclipse IDE。屏幕锁定的解决方案在

之下

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

答案 3 :(得分:2)

(1)我的活动实现了TextToSpeech.OnInitListener

(2)我在onInit方法中播放合成语音,但我想(不尝试过)你可以在调用onInit()之后随时播放它。但这是关键,你必须等待TextToSpeech引擎初始化。

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

答案 4 :(得分:0)

试试这个

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

答案 5 :(得分:0)

唤醒锁,我设法以这种方式工作:

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