如何从没有主线程或活动的服务调用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()方法中,同样保证在主线程上调用。