编程语言
首页 > 编程语言> > java – 在发生点击时阻止RecognizerIntent.ACTION_RECOGNIZE_SPEECH

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