android.speech.RecognitionService 某些第 3 方语音识别器出现 SecurityException

android.speech.RecognitionService SecurityException with some 3rd-party speech recognizers

我们创建了一个使用 Google 语音识别器的 Android 应用程序,我们首先在程序中选择要使用的 Google 语音识别器。大多数设备工作正常,只有少数设备(MEIZU_M5、U78-E、Apollo Lite 等)报告以下异常。好像和联发科的语音命令有些冲突?我们发现 Mediatek 的其他一些设备工作正常。令人困惑。

java.lang.SecurityException: Not allowed to bind to service Intent { act=android.speech.RecognitionService cmp=com.mediatek.voicecommand/.service.VoiceWakeupRecognitionService }
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1421)
at android.app.ContextImpl.bindService(ContextImpl.java:1385)
at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
at android.speech.SpeechRecognizer.startListening(SpeechRecognizer.java:287)

要追溯代码,源代码最多只显示ContextWrapper.java。如何让它显示到 ContextImpl.java:1421?

通过 firebase 日志,我们发现它发生在许多第 3 方语音识别器中:

com.mediatek.voicecommand
com.htc.android.voicedictation
com.vlingo.midas
com.iflytek.speechcloud
com.iflytek.speechsuite
...

我们还测试了其他一些运行良好的第 3 方语音识别器。那些导致异常的语音识别器是否只用于系统语音命令而不是应用程序访问?

欢迎任何想法或经验。

最后,我们从Android开发者的一些信息中找到了根本原因 Services overview:

但是,您可以在清单文件中将服务声明为私有并阻止其他应用程序访问。

这些第 3 方 SpeechRecognizer 服务是私有的,不能被其他应用程序调用。 因此,我们只是尝试捕获此异常并通知用户安装 Google App(语音输入)。或者您可以通过跳过它们来排除这些意外的 SpeechRecognizer。