【问题标题】:How to invoke Speechrecognizer methods from service with no main thread or activity如何从没有主线程或活动的服务中调用 Speechrecognizer 方法
【发布时间】:2014-08-03 18:54:26
【问题描述】:

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

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

正如 android 文档中所述,here:

'这个类的方法只能从主应用线程调用。'

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

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

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

Comparison of Speech Recognition use in Android: by Intent or on-thread?

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

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

我的代码和这个链接顶部答案中的代码基本相同:(没有 IncomingHandler 类,我相信它只是用来控制监听器的时间)

Android Speech Recognition as a service on Android 4.1 & 4.2

非常感谢您的帮助,在此先感谢。 这是我的第一个 android 应用程序,所以我对它很陌生,请多多包涵;)

【问题讨论】:

    标签: java android android-service


    【解决方案1】:

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

    现在,我没有您的代码,但我假设您使用的是 IntentService 或类似名称。 这带来了一个问题,因为IntentService.onHandleIntent()工作线程

    上被激活

    要解决,要么:

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

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

    【讨论】:

    • 感谢您的快速响应;)因此,由于 android 系统在某个事件上调用了我的自定义服务,我想选项 A 会更合适,因为没有调用 startService(Intent )。唯一的问题是我计划在服务内/服务内的另一种方法(不是 onCreate)中调用语音识别器,因为我需要该方法首先为我做一些事情。是否可以只使用方法检索主线程,然后在其上运行调用代码?我会考虑选项 A ...如果您有任何建议或想法,请告诉我,再次感谢;)
    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    相关资源
    最近更新 更多