You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:37:03