首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓API21:未调用VoiceInteractionService onReady()

安卓API21:未调用VoiceInteractionService onReady()
EN

Stack Overflow用户
提问于 2014-11-17 22:17:31
回答 2查看 2.6K关注 0票数 9

我对新的Android API21有一个问题,特别是VoiceInteractorService。

我想在API21中使用新的热词检测。如果我按下一个按钮,“google”这个词的热词检测就会开始。

当我有一个活动(MainActivity),并且我想从VoiceInteractorService调用createAlwaysOnHotwordDetector(String keyphrase,Locale locale,AlwaysOnHotwordDetector.Callback回调)方法时,我得到一个错误: java.lang.IllegalStateException:在调用onReady()之前不可用。我试图暂时解决这个问题,方法是使用while with try catch循环来查看何时调用onReady(),并且可以执行createAlwaysOnHotwordDetector()方法。我发现onReady()从未被调用过,即使在让系统循环了15分钟之后也是如此。

有谁知道如何解决这个问题吗?

提前谢谢。

这是我调用VoiceInteractorService的活动。

代码语言:javascript
复制
import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.service.voice.AlwaysOnHotwordDetector;
import android.service.voice.AlwaysOnHotwordDetector.Callback;
import android.service.voice.VoiceInteractionService;
import android.service.voice.AlwaysOnHotwordDetector.EventPayload;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    Button btn;
    VoiceInteractionService service;
    AlwaysOnHotwordDetector.Callback callback;
    Locale locale = new Locale("nl-NL");
    Context ctx;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button1);
        ctx = getApplicationContext();
        service = new VoiceInteractionService();
        btn.setOnClickListener(new OnClickListener() {
            // Create Hotword detector on button click
            @Override
            public void onClick(View v) {
                service.createAlwaysOnHotwordDetector("google", locale, callback);
            }
        });

        callback = new Callback() {

            @Override
            public void onRecognitionResumed() {
                // TODO Auto-generated method stub

            }

            @Override
            public void onRecognitionPaused() {
                // TODO Auto-generated method stub

            }

            @Override
            public void onError() {
                // TODO Auto-generated method stub
                Log.d("error", "error");
            }

            @Override
            public void onDetected(EventPayload eventPayload) {
                // TODO Auto-generated method stub
                // Display Toast message when Hotword is detected
                Toast.makeText(ctx, "Google", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onAvailabilityChanged(int status) {
                // TODO Auto-generated method stub
            }
        };
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-05-23 19:10:57

VoiceInteractionService被设计为子类来创建您自己的语音交互服务。一次只能启用一个这样的服务,就像键盘一样。一旦用户启用了它,它就会在任何地方都是活动的,而不仅仅是在特定的活动中。

您不能使用VoiceInteractionService为特定活动提供语音识别。

票数 0
EN

Stack Overflow用户

发布于 2018-05-29 22:48:03

答案1: AlwaysOnHotwordDetector是为系统应用设计的。如果你应该创建系统应用程序,你就能够给出权限android.permission.MANAGE_VOICE_KEYPHRASES,最终你可以实现你想要的(onReady将被调用)。

为了更好地理解,请通过此example of AlwaysOnHotwordDetector in Android

答案2:另一种方式是通过访问NDK来实现。

要么你自己挖掘和开发来定制,要么这样做,要么说Bingo。

或者执行以下操作https://github.com/Kitt-AI/snowboy/tree/master/examples/Android

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26974696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档