android - TextToSpeech.setEngineByPackageName() 触发 NullPointerException

标签 android text-to-speech

我的 Activity 的 onInit() 包含对 TextToSpeech.setEngineByPackageName() 的调用:

  tts = new TextToSpeech(this, this);
  tts.setEngineByPackageName("com.ivona.tts.voicebeta.eng.usa.kendra");

它在 Android 2.2.2 设备上工作,但在 Android 2.3.4 设备上它产生了 NullPointerException,堆栈跟踪如下:

 E/TextToSpeech.java - setEngineByPackageName(3423): NullPointerException
 W/System.err(3423): java.lang.NullPointerException
 W/System.err(3423):    at android.os.Parcel.readException(Parcel.java:1328)
 W/System.err(3423):    at android.os.Parcel.readException(Parcel.java:1276)
 W/System.err(3423):    at android.speech.tts.ITts$Stub$Proxy.setEngineByPackageName(ITts.java:654)
 W/System.err(3423):    at android.speech.tts.TextToSpeech.setEngineByPackageName(TextToSpeech.java:1356)

因为我提供了一个硬编码的字符串参数,所以我知道该参数不是导致 NullPointerException 的原因。

我也知道 setEngineByPackageName()已弃用,但这只是从 API 14 开始的,所以这不是原因。

知道是什么导致了这个 NullPointerException 异常吗?

编辑:如果这没有导致无休止的轰炸,我就不会关心“为什么”:

I/TextToSpeech.java(3652): initTts() successfully bound to service

随后调用 onInit()(由系统调用,而不是我的代码调用)。

我希望如果我理解为什么会发生这种情况,我就可以停止对 onInit() 的轰炸并从错误中优雅地恢复。

最佳答案

您引用的 TTS 引擎是否安装在 2.3.4 设备上?如果是,则可能是平台错误。

编辑: 不记得我这样做时得到了什么结果,但是当包不存在时调用 setEngineByPackageName() 不是一个好主意。检查它是否已安装,如果未安装,请不要尝试使用它。像这样的东西:

boolean isPackageInstalled(String packageName) {
  PackageManager pm = context.getPackageManager();
  try {
    PackageInfo pi = pm.getPackageInfo(packageName, 0);

    return pi != null;
  } catch (NameNotFoundException e) {
    return false;
  }
}

关于android - TextToSpeech.setEngineByPackageName() 触发 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492800/

相关文章:

android - 如何签署已编译的 Apk

android - StartActivityForResult 与 MVVM 架构组件

android - Textview setCompoundDrawables 不改变或显示

Android 移动视觉 API 和 NN API

最近缺少 Android 应用程序图标,但在其他任何地方都存在

Android 文本转语音初始化速度很慢

android - 扩展安卓 TTS 引擎

java - 从语言显示名称获取语言环境

android - 如何将 TTS 输出保存在 android 上的音频文件中?

ios - 如何使用 iOS 版 Nuance Vocalizer、Speechkit 2 检测语音结束