Как выполнить запрос по умолчанию 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);
}