问题
In my main activity I launch a new 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);
Then I retrieve the keywords that were spoken here:
@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);
}
Now all this works just fine, but I noticed a problem. During the RecognizerIntent.ACTION_RECOGNIZE_SPEECH.. if I tap the google glass (in any way on the D-pad), it'll bug out the voice recognition. Meaning that it refuses to detect any sound. What could be causing this problem?
Logcat Update
I'm getting two main errors during the SPEECH_REQUEST when I tap the Dpad:
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.
then a couple seconds later:
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
Update:
I noticed that once I bug the RecognizerIntent.ACTION_RECOGNIZE_SPEECH
, a couple swipe downs in a row will finally be detected and I return either to a new RecognizerIntent.ACTION_RECOGNIZE_SPEECH or it just leaves the app completely. I'll post more information about this in the coming days.
回答1:
If you're still having your problem, try this:
At the very top, declare a private GestureDetector
:
private GestureDetector gestureDetector;
Then, in the onCreate()
method, call a method that creates the GestureDetector
(there is no reason to do it this way over just creating it in the onCreate()
method - it just looks cleaner this way and is more organized):
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
gestureDetector = createGestureDetector(this);
}
The createGestureDetector()
method looks like this:
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;
}
You have to make sure to include the onGenericMotionEvent()
method at the end there. That is what makes sure that your GestureDetector
is notified every time a motion event occurs.
The thing that I added is very minute, but very important - by changing the return value to true
on the onSingleTapUp()
method, you are telling Glass that the event was handled correctly (which in this case, is just doing nothing).
You can read more about GestureDetector
s here.
来源:https://stackoverflow.com/questions/27251831/recognizerintent-action-recognize-speech-blocked-when-a-tap-occurs