折腾:
【未解决】Android Studio中gradle编译rcjsta项目多个使用或覆盖了已过时的API等报错
期间,继续解决其他的问题
rcsjta/samples/api/tts/src/com/orangelabs/rcs/tts/PlayTextToSpeech.java:98: 警告: [deprecation] TextToSpeech中的speak(String,int,HashMap<String,String>)已过时 tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null); ^

去看定义

果然是:Deprecated
推荐是:
* @deprecated As of API level 21, replaced by
* {@link #speak(CharSequence, int, Bundle, String)}.
*/但是如何改,需要好好研究一下逻辑
texttospeech speak deprecated
在当前文件中找到实现了
android/speech/tts/TextToSpeech.java
/**
* Speaks the text using the specified queuing strategy and speech parameters, the text may
* be spanned with TtsSpans.
* This method is asynchronous, i.e. the method just adds the request to the queue of TTS
* requests and then returns. The synthesis might not have finished (or even started!) at the
* time when this method returns. In order to reliably detect errors during synthesis,
* we recommend setting an utterance progress listener (see
* {@link #setOnUtteranceProgressListener}) and using the
* {@link Engine#KEY_PARAM_UTTERANCE_ID} parameter.
*
* @param text The string of text to be spoken. No longer than
* {@link #getMaxSpeechInputLength()} characters.
* @param queueMode The queuing strategy to use, {@link #QUEUE_ADD} or {@link #QUEUE_FLUSH}.
* @param params Parameters for the request. Can be null.
* Supported parameter names:
* {@link Engine#KEY_PARAM_STREAM},
* {@link Engine#KEY_PARAM_VOLUME},
* {@link Engine#KEY_PARAM_PAN}.
* Engine specific parameters may be passed in but the parameter keys
* must be prefixed by the name of the engine they are intended for. For example
* the keys "com.svox.pico_foo" and "com.svox.pico:bar" will be passed to the
* engine named "com.svox.pico" if it is being used.
* @param utteranceId An unique identifier for this request.
*
* @return {@link #ERROR} or {@link #SUCCESS} of <b>queuing</b> the speak operation.
*/
public int speak(final CharSequence text,
final int queueMode,
final Bundle params,
final String utteranceId) {
return runAction(new Action<Integer>() {
@Override
public Integer run(ITextToSpeechService service) throws RemoteException {
Uri utteranceUri = mUtterances.get(text);
if (utteranceUri != null) {
return service.playAudio(getCallerIdentity(), utteranceUri, queueMode,
getParams(params), utteranceId);
} else {
return service.speak(getCallerIdentity(), text, queueMode, getParams(params),
utteranceId);
}
}
}, ERROR, "speak");
}新的:
speak(CharSequence text, int queueMode, Bundle params, String utteranceId) Speaks the text using the specified queuing strategy and speech parameters, the text may be spanned with TtsSpans.
旧的:
int speak(String text, int queueMode, HashMap<String, String> params) This method was deprecated in API level 21. As of API level 21, replaced byspeak(java.lang.CharSequence, int, android.os.Bundle, java.lang.String).

String text = editText.getText().toString();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);
} else {
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}好像直接用null即可?
把:
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null);
改为:
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null, null);
试试:
结果红色错误:
去看提示,选第二个:

再把之前的加上:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null, null);
} else {
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null);
}
然后重新编译试试
竟然还是会报错:

看来,虽然此处代码逻辑没问题了
但是要彻底杜绝警告,估计只能参考
去弄成独立函数,然加上@SuppressWarnings(“deprecation”)了。
@SuppressWarnings("deprecation")
private void ttsUnder20(String msgText, final int queueMode) {
tts.speak(msgText, queueMode, null);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void ttsGreater21(String msgText, final int queueMode) {
tts.speak(msgText, queueMode, null, null);
}调用:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null, null);
ttsUnder20(messages.get(0), TextToSpeech.QUEUE_FLUSH);
} else {
// tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null);
ttsGreater21(messages.get(0), TextToSpeech.QUEUE_FLUSH);
}但是:
【未解决】Android项目中@TargetApi语法报错:Cannot resolve symbol TargetApi
不过,突然想到,既然Android Studio足够智能,是否是,给上面依旧报错的代码,直接加上sdk版本的if判断,是否就可以消除警告了?
去试试能否实现具体写法
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null, null);
// ttsUnder20(messages.get(0), TextToSpeech.QUEUE_FLUSH);
} else {
@SuppressWarnings("deprecation")
{
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null);
}
// ttsGreater21(messages.get(0), TextToSpeech.QUEUE_FLUSH);
}结果提示:
Annotations are not allowed here

不支持这么写
对单独一行代码这么写
另外也试了试:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// @SuppressWarnings("deprecation")
// {
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null);
}问题依旧
所以放弃这条路。
现在已解决:
【已解决】Android项目中@TargetApi语法报错:Cannot resolve symbol TargetApi
然后重新编译,问题解决了。
【总结】
此处之前代码:
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null, null);
报错:
[deprecation] TextToSpeech中的speak(String,int,HashMap<String,String>)已过时 tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null); ^
原因:
TextToSpeech中的speak
已废弃旧的:
int speak(final String text, final int queueMode, final HashMap<String, String> params)
推荐用新的:
int speak(final CharSequence text, final int queueMode, final Bundle params, final String utteranceId)
解决办法:
直接改为新的函数写法即可。
比如:
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null, null);
但是有个问题:
就不支持旧的api
所以为了兼容,写成:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null, null);
} else {
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null);
}但是有个问题:
Android Studio编译后,对于:
tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null);
还是警告错误
所以为了规避警告的错误
写成:
import android.annotation.TargetApi;
@SuppressWarnings("deprecation")
private void ttsUnder20(String msgText, final int queueMode) {
tts.speak(msgText, queueMode, null);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void ttsGreater21(String msgText, final int queueMode) {
tts.speak(msgText, queueMode, null, null);
}
public void onInit(int status) {
。。。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ttsUnder20(messages.get(0), TextToSpeech.QUEUE_FLUSH);
} else {
ttsGreater21(messages.get(0), TextToSpeech.QUEUE_FLUSH);
}才最终规避了警告。
【后记】
不过,有个奇怪的事情:
之前的的另一处:
if (messages.size() > 1) {
for (int i = 1; i < messages.size(); i++) {
tts.speak(messages.get(i), TextToSpeech.QUEUE_ADD, null);
}
}中的speak:
tts.speak(messages.get(i), TextToSpeech.QUEUE_ADD, null);
也是和前面一样会报错的。
但是上述代码改动后,android studio重新编译后,竟然下面这个speak不报错了,很是奇怪。
不过后来再次重新编译,又报错了:

是对的,也是我们希望的。
(不过)为了代码完整性和一致性,也去改掉:
不过同时也发现前面代码写错了,20和21的调用写错了。
最终改为:
import android.annotation.TargetApi;
。。。
public class PlayTextToSpeech extends Service implements OnInitListener {
。。。
@SuppressWarnings("deprecation")
private void ttsUnder20(String msgText, final int queueMode) {
tts.speak(msgText, queueMode, null);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void ttsGreater21(String msgText, final int queueMode) {
tts.speak(msgText, queueMode, null, null);
}
/**
* TTS engine init
*
* @param status Status
*/
public void onInit(int status) {
if ((tts != null) && (status == TextToSpeech.SUCCESS)) {
Log.v(TAG, "TTS engine initialized with success");
if ((messages != null) && (messages.size() > 0)) {
// Speak
Log.v(TAG, "Start TTS session: play " + messages.size() + " messages");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null, null);
ttsGreater21(messages.get(0), TextToSpeech.QUEUE_FLUSH);
} else {
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// @SuppressWarnings("deprecation")
// {
// tts.speak(messages.get(0), TextToSpeech.QUEUE_FLUSH, null);
// }
ttsUnder20(messages.get(0), TextToSpeech.QUEUE_FLUSH);
}
if (messages.size() > 1) {
for (int i = 1; i < messages.size(); i++) {
// tts.speak(messages.get(i), TextToSpeech.QUEUE_ADD, null);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ttsGreater21(messages.get(i), TextToSpeech.QUEUE_ADD);
} else {
ttsUnder20(messages.get(i), TextToSpeech.QUEUE_ADD);
}
}
}
。。。
}
}
}即可。
转载请注明:在路上 » 【已解决】rcsjta项目编译出错:TextToSpeech中的speak(String,int,HashMap