Android 13及以上版本语音识别功能失效问题求助
Android 12+ 语音识别适配问题
我开发的Android应用集成了语音识别功能,在Android 11及以下版本运行正常,但在Android 12及以上版本无法正常工作,排查许久仍未找到问题根源。尝试过相关适配方案,但问题依旧。
初始化代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 其他初始化代码 initSpeechRecognition(this); speech.setRecognitionListener(this); recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en"); recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName()); recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName()); }
语音识别服务初始化方法
public void initSpeechRecognition(Activity activity) { String recognitionServiceName = getAvailableVoiceRecognitionService(activity); if (recognitionServiceName == null) return; speech = SpeechRecognizer.createSpeechRecognizer(activity, ComponentName.unflattenFromString(recognitionServiceName)); Log.i("TEST", recognitionServiceName); } public static String getAvailableVoiceRecognitionService(Activity activity) { final List<ResolveInfo> services = activity.getPackageManager().queryIntentServices( new Intent(RecognitionService.SERVICE_INTERFACE), 0); String recognitionServiceName = null; for (final ResolveInfo info : services) { String packageName = info.serviceInfo.packageName; String serviceName = info.serviceInfo.name; String testRecognitionServiceName = packageName + "/" + serviceName; ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i("TEST", name + "::" + service); } @Override public void onServiceDisconnected(ComponentName name) { Log.i("TEST", name + "::Disconnected"); } }; Intent serviceIntent = new Intent(RecognitionService.SERVICE_INTERFACE); ComponentName recognizerServiceComponent = ComponentName.unflattenFromString(testRecognitionServiceName); if (recognizerServiceComponent != null) { serviceIntent.setComponent(recognizerServiceComponent); try { boolean isServiceAvailableToBind = activity.bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE); if (isServiceAvailableToBind) { activity.unbindService(connection); recognitionServiceName = testRecognitionServiceName; break; } } catch (SecurityException e) { e.printStackTrace(); } } } return recognitionServiceName; }
识别回调实现
@Override public void onBeginningOfSpeech() { Log.i(VOICE_RECOGNITION, "onBeginningOfSpeech"); } @Override public void onBufferReceived(byte[] buffer) { Log.i(VOICE_RECOGNITION, "onBufferReceived: " + Arrays.toString(buffer)); } @Override public void onEndOfSpeech() { Log.i(VOICE_RECOGNITION, "onEndOfSpeech"); } @Override public void onError(int errorCode) { String errorMessage = getErrorText(errorCode); Log.d(VOICE_RECOGNITION, "FAILED " + errorMessage); } @Override public void onEvent(int arg0, Bundle arg1) { Log.i(VOICE_RECOGNITION, "onEvent"); } @Override public void onPartialResults(Bundle arg0) { Log.i(VOICE_RECOGNITION, "onPartialResults"); } @Override public void onReadyForSpeech(Bundle arg0) { Log.i(VOICE_RECOGNITION, "onReadyForSpeech"); } @Override public void onResults(Bundle results) { Log.i(VOICE_RECOGNITION, "onResults"); ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); StringBuilder text = new StringBuilder(); assert matches != null; for (String result : matches) text.append(result).append("\n"); audioToText.add(text.toString()); Log.i(VOICE_RECOGNITION, String.valueOf(audioToText)); } @Override public void onRmsChanged(float rmsdB) { Log.i(VOICE_RECOGNITION, "onRmsChanged: " + rmsdB); } public static String getErrorText(int errorCode) { String message; switch (errorCode) { case SpeechRecognizer.ERROR_AUDIO: message = "Audio recording error"; audioToText.add("audio recording error"); break; case SpeechRecognizer.ERROR_CLIENT: message = "Client side error"; audioToText.add("client side error"); break; case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: message = "Insufficient permissions"; audioToText.add("insufficient permissions"); break; case SpeechRecognizer.ERROR_NETWORK: message = "Network error"; audioToText.add("network error"); break; case SpeechRecognizer.ERROR_NETWORK_TIMEOUT: message = "Network timeout"; audioToText.add("network timeout"); break; case SpeechRecognizer.ERROR_NO_MATCH: message = "No match"; audioToText.add("no audio detected"); break; case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: message = "RecognitionService busy"; audioToText.add("recognition service busy"); break; case SpeechRecognizer.ERROR_SERVER: message = "error from server"; audioToText.add("error from server"); break; case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: message = "No speech input"; audioToText.add("no speech input"); break; default: message = "Didn't understand, please try again."; audioToText.add("no audio detected"); break; } return message; }
运行日志(Android 13设备)
2023-08-25 12:07:55.696 31209-31209 Voice Recognition I onReadyForSpeech 2023-08-25 12:07:55.730 31209-31209 Voice Recognition I onRmsChanged: -2.0 2023-08-25 12:07:58.091 31209-31209 Voice Recognition D FAILED No match
补充说明
- 已正确实现
startListening()和stopListening()方法,可正常触发 - Android 10设备运行正常,Android 13设备出现上述错误
- 已知Android 12+对语音识别服务有改动,但未找到完整适配方案,官方文档无对应代码示例
恳请提供问题分析或解决方案,感谢!
内容的提问来源于stack exchange,提问作者Zaid
相关产品推荐
相关产品推荐

