Я уверен, что вы знаете о большинстве следующих, но ради всеобъемлющего ответа:
Любое приложение может зарегистрировать в качестве поставщика услуг распознавания речи, так долго, как он регистрирует RecognitionService правильно. В случае с устройствами Samsung в Android Voice Search Settings будут показаны два поставщика, Google и Vlingo.
Google RecognitionService
упакован в свое приложение Google 'Now', которое, как вам известно, зависит от сервисов Google Play.
Приложение Vlingo's RecognitionService
находится в их приложении S-Voice, которое доступно только для публичных предустановок на устройствах Samsung - поэтому на самом деле оно не применимо к вашему вопросу, но я упоминаю в связи с моим комментарием ниже.
Перед тем, как использовать SpeechRecognizer, вы всегда должны использовать статический вспомогательный метод:
if (SpeechRecognizer.isRecognitionAvailable(getApplicationContext())) {
// initialise
} else {
// nope
}
Как цитируемый method documentation:
Проверяет, является ли услуга распознавания речи доступны в системе , Если этот метод возвращает false, createSpeechRecognizer (Контекст) не удастся.
Возвращает истину, если распознавание доступно, иначе ложь
Если вы используете этот метод в вашем конкретном случае использования, она должна возвращать ложь, так что вам не придется беспокоиться о инициализации аварий.
В качестве примечания, Vlingo вернется сюда, но никогда не вернет речевые ответы, по какой-то причине он просто выбросит ERROR_NETWORK. Это раздражает.
Помимо выше проверки, вы можете также запросить, который, если таковые имеются, приложения регистрируются в качестве поставщика услуг Voice Recognition, выполнив следующие действия:
final List<ResolveInfo> services = context.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
Любой пустой список, будет означать не провайдеры не доступны.
Наконец, как уже упоминалось в комментариях, вы могли бы всегда скрипичный чек и убедитесь, что установлено приложение Google:
Предполагая, что вы ориентируетесь Jelly Bean + Я использую следующий метод удобства:
/**
* Check if the user has a package installed
*
* @param ctx the application context
* @param packageName the application package name
* @return true if the package is installed
*/
public static boolean isPackageInstalled(@NonNull final Context ctx, @NonNull final String packageName) {
try {
ctx.getApplicationContext().getPackageManager().getApplicationInfo(packageName, 0);
return true;
} catch (final PackageManager.NameNotFoundException e) {
return false;
}
}
Где имя пакета Google: com.google.android.googlequicksearchbox
В конце концов, вместо того, провайдера RESTful, которые вы могли бы использовать. Не все свободны.
Возможность проверить через PackageManager, если «Gapps» установлен, например, проверит 'com.android.vending'. Если нет, то альтернативным способом распознавания речи может быть sphinx: http://cmusphinx.sourceforge.net/ – Opiatefuchs
Хорошая идея. Однако языковой файл Sphinx занимает много места. Будет ли приведенный выше код сбой, если проверка не будет добавлена? – Raptor
хорошо, это очень хороший вопрос, и если бы я мог, я бы дал больше стимулов этому. Но на самом деле ..... я не знаю. Если я начну с нормального случая, намерение обработать какое-либо действие приведет к сбою, если для этого нет пакета. Я думаю, что это то же самое с отсутствующими gapps, почему его следует рассматривать по-другому. Избегайте этого можно с помощью намерения.resolveActivity (pckManager)! = Null', я думаю. – Opiatefuchs