Как выполнить запрос по умолчанию SpeechRecognizer

Как узнать имя ComponentName системного распознавателя речи по умолчанию, то есть тот, который возвращается при createSpeechRecognizer (контекст контекста)? (На самом деле, мне нужно только выяснить, какие языки ввода он поддерживает, поэтому, если есть ответ только на это, тогда я тоже был бы признателен.)

Рамка решает это с помощью

String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(),
                        Settings.Secure.VOICE_RECOGNITION_SERVICE);

(см. исходный код SpeechRecognizer.)

Однако это решение, похоже, не доступно для стороннего приложения.

Ответы

Ответ 1

Однако это решение, похоже, не доступно для стороннего приложения.

Я предполагаю, что вы пришли к такому выводу, потому что Settings.Secure.VOICE_RECOGNITION_SERVICE не является публичным API. Однако для Settings.Secure.getString() требуется имя строки для поиска в защищенной таблице для второго аргумента. Итак, вы можете просто указать фактическое имя строки, которую вы ищете: voice_recognition_service.

Таким образом, вы можете использовать тот же код из SpeechRecognizer с небольшими изменениями:

String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(),
        "voice_recognition_service");

Надеюсь, что это поможет.

Ответ 2

ОБНОВЛЕНИЕ (я неправильно читаю исходный вопрос)

SpeechRecognizer - это не то, что делает речевую обработку, но намерение, которое вы передаете SpeechRecognizer, есть (через startListening(Intent intent)). Это намерение использует RecognizerIntent.ACTION_RECOGNIZE_SPEECH и, AFAIK, может быть обнаружено старомодным способом.

Чтобы определить значения по умолчанию, попробуйте разрешить намерение, которое вы хотите найти по умолчанию, но с установкой PackageManager.MATCH_DEFAULT_ONLY.

Неподтвержденный код:

String detectDefaultSpeechRecognizer(Context context) {
  final Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
  // 1: Try to find the default speech intent
  final ResolveInfo defaultResolution = context.getPackageManager().resolveService(speechIntent, PackageManager.MATCH_DEFAULT_ONLY);
  if (defaultResolution != null) {
    final ActivityInfo activity = defaultResolution.activityInfo;
    if (!activity.name.equals("com.android.internal.app.ResolverActivity")) {
      //ResolverActivity was launched so there is no default speech recognizer
      return "";
    }
  }
  // 2: Try to find anything that we can launch speech recognition with. Pick up the first one that can.
  final List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentServices(speechIntent, PackageManager.MATCH_DEFAULT_ONLY);
  if (!resolveInfoList.isEmpty()) {
    speechIntent.setClassName(resolveInfoList.get(0).activityInfo.packageName, resolveInfoList.get(0).activityInfo.name);
    return resolveInfoList.get(0).activityInfo.packageName;
  }
  return "";
}

OLD ANSWER

Проверьте GAST, у него есть способ проверить, поддерживается ли язык в распознавателе речи.
https://github.com/gast-lib/gast-lib/blob/master/library/src/root/gast/speech/SpeechRecognizingActivity.java#L70

Вы также можете попытаться вручную проверить тег метаданных <recognition-service>. http://developer.android.com/reference/android/speech/RecognitionService.html#SERVICE_META_DATA

Ответ 3

Если вы хотите узнать, какие языки ввода поддерживаются системным речевым распознавателем по умолчанию (createSpeechRecognizer (Context context)), есть более простой способ для этого.

Все, что вам нужно сделать, это использовать RecognizerIntent.getVoiceDetailsIntent, который будет проверять языки распознавания речи по умолчанию:

Intent intent = RecognizerIntent.getVoiceDetailsIntent(getApplicationContext());

        if (intent != null) {
            ctx.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, final Intent intent) {
                    Log.d(TAG,
                            "Receiving Supported Speech Recognition Languages broadcast "
                                    + intent);

                    final Bundle extra = getResultExtras(false);

                    if ((getResultCode() == Activity.RESULT_OK)
                            && (extra != null)
                            && (mHandler != null)
                            && ((extra
                                    .containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) || (extra
                                    .containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)))) {

                        List<String> supportedLanguages = extra
                                .getStringArrayList(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
                        String prefLang = extra
                                .getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE);

                    }
                }

            },

            null, Activity.RESULT_OK, null, null);
        }