我的 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/