自定义SpeechRecognition重启时应用闪烁问题技术求助
解决SpeechRecognizer重启时的UI闪烁问题
嘿,我一眼就揪出你遇到的黑屏闪烁问题的根源了——你在startRecognising()方法里多调用了startActivity(mSpeechRecognizerIntent),这完全是多余的!
你选择自定义SpeechRecognizer搭配RecognitionListener,本来就是为了避开谷歌自带的弹窗式识别界面,但最后却又启动了系统的语音识别Activity。每次重启监听器时,这个系统界面会被短暂拉起然后快速关闭,这就是你看到的黑屏闪烁的原因。
第一步:移除多余的启动Activity代码
先把startRecognising()里的最后一行删掉,修改后的代码如下:
public void startRecognising() { mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); mySpeechRecogniser listener = new mySpeechRecogniser(); Intent mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "el"); mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName()); mSpeechRecognizer.setRecognitionListener(listener); mSpeechRecognizer.startListening(mSpeechRecognizerIntent); // 删掉这行多余的代码:startActivity(mSpeechRecognizerIntent); }
第二步:优化重启逻辑,减少不必要的销毁重建
你当前的重启逻辑是直接销毁再重建SpeechRecognizer,其实完全没必要这么折腾——我们可以复用已有的实例,只需要停止当前监听然后重新开始即可:
// 优化后的重启方法 public void restartSpeechListener() { // 先检查实例是否有效,且设备支持语音识别 if (mSpeechRecognizer != null && SpeechRecognizer.isRecognitionAvailable(this)) { // 停止当前监听 mSpeechRecognizer.stopListening(); // 直接重新开始监听,不用销毁重建 mSpeechRecognizer.startListening(mSpeechRecognizerIntent); } else { // 只有当实例无效时,才重新创建 startRecognising(); } }
注意:记得把mSpeechRecognizerIntent改成类的成员变量,这样不用每次重启都重新创建,能提升一点性能。
额外的优化建议
- 在Activity销毁时,别忘了解构
SpeechRecognizer,避免内存泄漏:@Override protected void onDestroy() { super.onDestroy(); if (mSpeechRecognizer != null) { mSpeechRecognizer.destroy(); mSpeechRecognizer = null; } } - 每次启动监听前,最好先检查
SpeechRecognizer.isRecognitionAvailable(this)的返回值,避免在不支持语音识别的设备上触发异常。
按照上面的方法修改后,重启监听器时就不会再拉起系统的识别界面,黑屏闪烁的问题应该就能彻底解决了!
内容的提问来源于stack exchange,提问作者John-Aliferis
相关产品推荐
相关产品推荐

