java – 在发生点击时阻止RecognizerIntent.ACTION_RECOGNIZE_SPEECH
作者:互联网
在我的主要活动中,我发布了一个新的Intent:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "What would you like to find?\n For example \"Open heart surgery\"");
startActivityForResult(intent, SPEECH_REQUEST);
然后我检索这里说出的关键字:
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) {
List<String> results = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
String spokenText = results.get(0);
Intent intent = new Intent(ApiDemoActivity.this,SearchActivity.class);
intent.putExtra("keyword", spokenText);
startActivity(intent);
finish();
}
super.onActivityResult(requestCode, resultCode, data);
}
现在这一切都很好,但我注意到了一个问题.在RecognizerIntent.ACTION_RECOGNIZE_SPEECH期间……如果我点击谷歌眼镜(以任何方式在D-pad上),它将会错误地识别语音.这意味着它拒绝检测任何声音.什么可能导致这个问题?
Logcat更新
点击Dpad时,我在SPEECH_REQUEST期间遇到两个主要错误:
12-08 10:12:58.687: E/SpeechRecognizer(940): not connected to the recognition service
12-08 10:12:58.695: E/GlassRecognitionService[41e733b8](940): VoiceService disconnected.
logcat的:
12-03 09:45:06.513: E/SpeechRecognizer(847): not connected to the recognition service
12-03 09:45:06.513: I/BroadcastingVoiceInputCallback[425b67c8](847): Unregistered GlassRecognitionService
12-03 09:45:06.513: E/GlassRecognitionService[42b01bf0](847): VoiceService disconnected.
12-03 09:45:06.521: I/RecognizerController(847): stopListening
12-03 09:45:06.521: I/RecognizerController(847): detachVoiceInputCallback
12-03 09:45:06.521: I/RecognizerFactory(847): deactivate() called on no-op recognizer, nothing to do.
12-03 09:45:06.521: I/VoiceEngine[425ecfd8](847): Setting active recognizer: VoiceConfig []
12-03 09:45:06.521: I/RecognizerFactory(847): activate() called on no-op recognizer, nothing to do.
12-03 09:45:06.521: I/RecognizerController(847): cancel
12-03 09:45:06.537: D/dalvikvm(847): threadid=47: thread exiting, not yet detached (count=0)
12-03 09:45:06.545: D/native_audio_voice_microphone(847): *** Close native audio interface for GlassVoice. NativeAudioInterfaceWrapper_nativeClose() ***
12-03 09:45:06.552: I/ConcurrentAudioInterface[4256aec8](847): Closed audio interface.
然后几秒钟后:
12-03 09:45:16.295: V/GlassNotification(589): Received notification id: 1 packageName: com.google.glass.settings.ui
12-03 09:45:16.295: V/GlassNotification(589): skipping since notification not whitelisted
12-03 09:45:19.529: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0xd9
12-03 09:45:19.529: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x17b
12-03 09:45:19.537: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x234
12-03 09:45:19.537: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x315
12-03 09:45:19.592: D/dalvikvm(770): GC_CONCURRENT freed 386K, 8% free 5774K/6212K, paused 14ms+2ms, total 46ms
12-03 09:45:32.279: V/GlassNotification(589): Received notification id: 1 packageName: com.google.glass.settings.ui
12-03 09:45:32.279: V/GlassNotification(589): skipping since notification not whitelisted
12-03 09:45:43.490: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0xd9
12-03 09:45:43.498: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x17b
12-03 09:45:43.506: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x234
12-03 09:45:43.506: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x315
12-03 09:45:44.412: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0xd9
12-03 09:45:44.412: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x17b
12-03 09:45:44.420: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x234
12-03 09:45:44.420: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x315
12-03 09:45:45.638: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0xd9
12-03 09:45:45.638: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x17b
12-03 09:45:45.646: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x234
12-03 09:45:45.654: E/ming$MessageInputStream(770): bad domain name: possible circular name detected. Bad offset: 0x41 at 0x315
12-03 09:45:48.295: V/GlassNotification(589): Received notification id: 1 packageName: com.google.glass.settings.ui
12-03 09:45:48.295: V/GlassNotification(589): skipping since notification not whitelisted
12-03 09:45:48.342: D/dalvikvm(725): GC_EXPLICIT freed 173K, 4% free 5225K/5440K, paused 2ms+4ms, total 38ms
12-03 09:45:55.217: V/AlarmManager(506): triggered: flg=0x4 cmp=com.google.glass.logging/.WatchdogService
更新:
我注意到,一旦我弄错了RecognizerIntent.ACTION_RECOGNIZE_SPEECH,最终会检测到连续几次向下滑动并返回到新的RecognizerIntent.ACTION_RECOGNIZE_SPEECH或它完全离开应用程序.我将在未来几天发布更多相关信息.
解决方法:
如果您仍然遇到问题,请尝试以下方法:
在最顶层,声明一个私人GestureDetector:
private GestureDetector gestureDetector;
然后,在onCreate()方法中,调用一个创建GestureDetector的方法(没有理由这样做只是在onCreate()方法中创建它 – 它只是看起来更干净,更有条理):
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
gestureDetector = createGestureDetector(this);
}
createGestureDetector()方法如下所示:
private GestureDetector createGestureDetector(Context context) {
GestureDetector gestureDetectorTemp = new GestureDetector(context, new GestureDetector.OnGestureListener() {
//we are creating our gesture detector here
@Override
public boolean onDown(MotionEvent motionEvent) {
return false;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) { //onTap
return true; //<---this is the key
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float distanceX, float distanceY) {
return false; //this is the wrong kind of scroll
}
@Override
public void onLongPress(MotionEvent motionEvent) {
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
return false;
}
});
return gestureDetectorTemp;
}
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
if (gestureDetector != null) {
return gestureDetector.onTouchEvent(event);
}
return false;
}
您必须确保在那里包含onGenericMotionEvent()方法.这就是确保每次发生运动事件时都会通知您的GestureDetector的原因.
我添加的内容非常简单,但非常重要 – 通过在onSingleTapUp()方法上将返回值更改为true,您告诉Glass事件已正确处理(在这种情况下,它什么都不做).
您可以阅读更多关于GestureDetectors here的信息.
标签:java,android,android-logcat,google-glass,google-gdk 来源: https://codeday.me/bug/20190703/1362310.html