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

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

Рамка решает это

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

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

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

Solutions Collecting From Web of "Как выполнить запрос по умолчанию SpeechRecognizer"

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

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

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

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

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

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

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 ""; } 

СТАРЫЙ ОТВЕТ

Проверьте 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

Если вы хотите узнать, какие языки ввода поддерживаются системным речевым распознавателем по умолчанию ( 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); } за 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); }