Ответ 1
Это не тот ответ, на который вы надеетесь, как на момент написания статьи, я не верю, что есть прямое решение. Я очень надеюсь, что окажется ошибочным.
Я попросил улучшить эту информацию программным образом давным-давно - здесь
Усовершенствование предложило дополнительный параметр RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES
:
Конечно, было бы тривиально, если бы это было добавлено и использовано следующим образом:
final Intent vrIntent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
getContext().sendOrderedBroadcast(vrIntent, null, new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
final ArrayList<String> vrStringLocales = intent.getExtras().getStringArrayList(
RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
// This would be nice
final ArrayList<String> vrStringOfflineLocales = intent.getExtras().getStringArrayList(
RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES);
}
}, null, 1234, null, null);
Увы, этого никогда не было.
У вас есть еще два варианта, чтобы попытаться обработать это изящно.
В маловероятном случае, когда приложение запускается с правами root, вы можете проверить расположение /data/data/com.google.android.googlequicksearchbox/app_g3_models/
, которое содержит файлы в автономном режиме, помеченные ими по своему усмотрению.
Второе включает в себя знание, когда пользователю требуется запрос на установку отсутствующих автономных файлов.
По моему опыту, ошибка распознавания SpeechRecognizer.ERROR_SERVER
чаще всего обозначает это, но она не является надежной.
@Override
public void onError(final int error) {
switch (error) {
case SpeechRecognizer.ERROR_SERVER:
// TODO - prompt to install offline files
break;
}
}
При обнаружении вы можете направлять пользователя на правильный экран установки.
public static final String PACKAGE_NAME_GOOGLE_NOW = "com.google.android.googlequicksearchbox";
public static final String ACTIVITY_INSTALL_OFFLINE_FILES = "com.google.android.voicesearch.greco3.languagepack.InstallActivity";
public static boolean showInstallOfflineVoiceFiles(@NonNull final Context ctx) {
final Intent intent = new Intent();
intent.setComponent(new ComponentName(PACKAGE_NAME_GOOGLE_NOW, ACTIVITY_INSTALL_OFFLINE_FILES));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
try {
ctx.startActivity(intent);
return true;
} catch (final ActivityNotFoundException e) {
} catch (final Exception e) {
}
return false;
}
Использование жестко закодированных значений, таких как это, конечно, не идеально, но и эта ситуация не существует!
Как только вы перепутали все вышеперечисленное и подумаете, что у вас есть хорошее временное решение - подумайте еще раз! Независимо от того, правильно ли пользователь установил отсутствующие автономные файлы, весьма вероятно, что он все равно не будет работать.
Мой ответ здесь описывает процесс, с которым я все еще должен вести мой пользователь. Это очень расстраивает.
Наконец, еще одна ошибка, которую нужно бросить в микс - RecognitionListener.onError(int) можно выбросить, если нет ошибки. Проверьте мой gist из ответа здесь, чтобы использовать BugRecognitionListener
, чтобы вы могли проверить, что обратные вызовы отправляются в правильном порядке и игнорируют те, которые этого не делают. Это остается проблемой, несмотря на мой ответ, предлагающий исправление в предыдущем выпуске.
Вышесказанное должно держать вас в напряжении! Удачи....