如何获取设备的默认 SpeechService 提供程序 - Android API 13

stu*_*ent 5 android speech-recognition

根据此页面,Android 13 删除了 SpeechService 实现,包括 RecognitionService 。它还提到:

应用程序应该使用设备的默认 SpeechService 提供程序,而不是硬编码特定的应用程序。

这是我在小于 13 的 API 上使用的代码:

String GOOGLE_RECOGNITION_SERVICE_NAME =
        "com.google.android.googlequicksearchbox/com.google.android.voicesearch.serviceapi.GoogleRecognitionService";

SpeechRecognizer speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context,
            ComponentName.unflattenFromString(GOOGLE_RECOGNITION_SERVICE_NAME));
Run Code Online (Sandbox Code Playgroud)

关于如何获取设备的 SpeechService 的默认提供程序有什么想法吗?

stu*_*ent 1

我通过实现以下代码解决了这个问题:

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) {

            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };

        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;
}
Run Code Online (Sandbox Code Playgroud)

然后启动 SpeechRecognizer:

public void initSpeechRecognition(Activity activity)
{
   String recognitionServiceName = getAvailableVoiceRecognitionService(activity);
    if (recognitionServiceName==null)
        return;

    speechRecognizer = SpeechRecognizer.createSpeechRecognizer(activity,
            ComponentName.unflattenFromString(recognitionServiceName));
 }



    
Run Code Online (Sandbox Code Playgroud)