我遇到了新的Android API21问题,特别是VoiceInteractorService。
我想在API21中使用新的Hotword检测。如果我按下按钮,则会对“Google”这个词进行热门词检测。应该开始。
当我有一个Activity(MainActivity)并且我想从VoiceInteractorService调用createAlwaysOnHotwordDetector(String keyphrase,Locale locale,AlwaysOnHotwordDetector.Callback callback)方法时,我收到一个错误:java.lang.IllegalStateException:在onReady之前不可用() 叫做。我试着通过使用try with try来暂时解决这个问题,看看何时调用onReady()并且我可以执行createAlwaysOnHotwordDetector()方法。我发现,即使让系统循环15分钟,也永远不会调用onReady()。
有人知道如何解决这个问题吗?
提前致谢。
这是我调用VoiceInteractorService的活动。
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
}
};
}
}
答案 0 :(得分:0)
VoiceInteractionService
旨在进行子类化以创建您自己的语音交互服务。一次只能启用一个这样的服务,就像键盘一样。一旦用户启用它,它就会在任何地方都处于活动状态,而不仅仅是在特定的活动中。
您无法使用VoiceInteractionService
为特定活动提供语音识别功能。
答案 1 :(得分:0)
答案1: AlwaysOnHotwordDetector适用于系统应用程序。如果你应该创建系统应用程序,你可以给予权限[android.permission.MANAGE_VOICE_KEYPHRASES],最终你可以实现你想要的(onReady将被调用)。
为了更好地理解,请完成此操作 example of AlwaysOnHotwordDetector in Android
答案2: 另一种方法是通过访问NDK来实现。
要么Dig&开发自己定制,制作SO&说宾果。
或做以下事情 https://github.com/Kitt-AI/snowboy/tree/master/examples/Android