如何从没有主线程或活动的服务调用Speechrecognizer方法

我知道Stackoverflow和其他网站上有很多关于SpeechRecognizer类的链接以及如何实现它。 我经历了其中几个并搜索了几个小时。 虽然在服务中有实现的例子,但它们似乎对我不起作用。

我的应用程序有一个活动,但它只用于用户设置,并且在我的服务运行时不运行,这是与系统分开调用的。 因此,为了运行/调用SpeechRecognizer类的方法,我的服务没有任何主要的应用程序线程。

正如在android文档中所述, 这里 :

‘必须仅从主应用程序线程调用此类的方法。

当我运行我的代码,包括我的服务类中的SpeechRecognizer.startListening(mSpeechRecognizerIntent)方法时,我收到以下错误:

java.lang.RuntimeException:SpeechRecognizer只能从应用程序的主线程中使用

有没有办法解决这个问题? 我已经读过SpeechRecognizer可以“在后台或服务中运行时识别语音”,我发现这里:

在Android中使用语音识别的比较:通过Intent还是on-thread?

所以这基本上是我想要的,我似乎无法启动SpeechRecognizer,因为我得到了上述错误。 你能否告诉我是否有必要在应用程序的主线程中调用以下方法(我没有):

mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); mSpeechRecognizer.setRecognitionListener(new SpeechRecognitionListener());

我的代码基本上与此链接的顶部答案中的代码相同:(没有IncomingHandler类,我相信它只用于控制监听器的时间)

Android语音识别作为Android 4.1和4.2上的服务

非常感谢一些帮助,提前谢谢。 这是我的第一个Android应用程序,所以我对它很新,请耐心等待;)

您不需要活动来访问主线程,服务就可以正常工作。

现在,我没有您的代码,但我假设您使用的是IntentService或类似代码。 这会产生问题,因为在工作线程上激活了IntentService.onHandleIntent()

要解决,要么:

A.将Speechrecognizer调用逻辑放在IntentService.onCreate()上,它始终在主线程上调用,或者

B.切换到使用标准服务并将您的逻辑放在onStartCommand()方法中,同样保证在主线程上调用。