java - 无法使用“TextToSpeech.speak()”方法
问题描述
我之前使用过这段代码。当时正在执行同一行。但是在这个新应用程序中,同一行代码没有执行。事实上,它会崩溃。
TextToSpeech TTS ;
String fail = "hey";
TTS.speak(fail ,TextToSpeech.QUEUE_ADD,null,null);
^^ 上面的代码不起作用
TextToSpeech TTS;
String SPEAKDRAW = "OH OHH DRAW";
TTS.speak(SPEAKDRAW, TextToSpeech.QUEUE_ADD,null,null);
^^ 上面的代码完美执行
这是崩溃的LogCat。
2019-08-19 22:46:05.997 15712-15712/com.example.anonymous D/AndroidRuntime: Shutting down VM
2019-08-19 22:46:06.002 15712-15712/com.example.anonymous E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.anonymous, PID: 15712
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.speech.tts.TextToSpeech.speak(java.lang.CharSequence, int, android.os.Bundle, java.lang.String)' on a null object reference
at com.example.anonymous.MainActivity$6.onClick(MainActivity.java:454)
at android.view.View.performClick(View.java:6612)
at android.view.View.performClickInternal(View.java:6589)
at android.view.View.access$3100(View.java:785)
at android.view.View$PerformClick.run(View.java:25925)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6823)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
2019-08-19 22:46:06.048 15712-15712/com.example.anonymous I/Process: Sending signal. PID: 15712 SIG: 9
解决方案
如果没有看到崩溃日志,很难确定这里的确切问题是什么。但是,我猜 TTS 引擎未安装在您正在测试该功能的设备中。我引用了开发人员的文档,
尽管所有支持 TTS 功能的 Android 设备都附带该引擎,但某些设备的存储空间有限,并且可能缺少特定于语言的资源文件。如果用户想要安装这些资源,TTS API 使应用程序能够查询平台以了解语言文件的可用性,并可以启动它们的下载和安装。因此,在创建活动时,第一步是检查是否存在具有相应意图的 TTS 资源。
因此,我建议您使用以下意图检查您的设备中是否安装了 TTS 引擎。
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
并通过覆盖您的活动中的功能来检查设备是否准备就绪onActivityResult
,如下所示。
private TextToSpeech mTts;
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
mTts = new TextToSpeech(this, this);
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent.setAction(
TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
此外,我没有看到new
您初始化TTS
变量的任何语句。但是,我认为您已经拥有它,正如您之前所说的那样。
希望有帮助!
推荐阅读
- gcc - Cortex-M 编译器生成不正确的 FOR 循环
- html - 我创建了一个自定义光标,它工作正常,但是当我在网页上滚动时,光标失去了位置
- pine-script - 将研究/策略附加到 Tradingview 绘图工具
- amazon-web-services - 访问公共 IP 地址后,使用 lightsail 启动 magento 应用程序后出现“无法访问站点”
- kubernetes-ingress - AKS 入口未使用 pod(具有活动性和就绪性问题)自定义问题进行健康检查
- javascript - 如何处理数组组件内的 PropTypes?
- javascript - 在状态变化时做出反应,useState 和 useEffect 是否也更新了?
- javascript - JQuery 和 AWS S3 网络托管的问题
- r - 如何在R中的线性回归模型中拟合多行
- microsoft-graph-api - Microsoft Graph API 预订 - 预订服务的公共 URL