У меня есть следующий родительский метод, который используется во всех случаях с помощью различных уровней API:
public int setVoice (@NonNull final String language, @NonNull final String region){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return setVoice21(language, region);
} else {
return setVoiceDeprecated(language, region);
}
}
и setVoice21
делает что-то вроде этого:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int setVoice21 ( @NonNull final String language, @NonNull final String region){
try {
// try some API 21 stuff
} catch (final IllformedLocaleException e) {
e.printStackTrace();
return setVoiceDeprecated(language, region);
}
setVoice21
содержит другой код, для которого требуется API 21+, в частности TextToSpeech.Voice и Locale.Builder
Когда я запускаю этот код на устройстве < API 21 Я получаю следующую ошибку:
W/dalvikvm: VFY: невозможно разрешить класс исключения 6232 (Ljava/util/IllformedLocaleException;) W/dalvikvm: VFY: отклонение код операции 0x0d при 0x0168 Вт /dalvikvm: VFY: отклонено Lcom/MyApp/Android/речь/MyTextToSpeech;.setVoice21 (Ljava/lang/String; Ljava/lang/String;) я W/dalvikvm: Verifier отклонен класс Lcom/myapp/android/speech/MyTextToSpeech;
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.VerifyError: ком/MyApp/Android/речь/MyTextToSpeech
Если я удалю IllformedLocaleException и просто заменим его стандартным исключением, приложение будет работать отлично, несмотря на многие другие ссылки на методы > API21 в setVoice21
Чтобы еще больше запутать меня, setVoice21
вызывает следующий класс
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private class TTSVoice {
public void buildVoice() {
try {
// Do some API 21 stuff
} catch (final IllformedLocaleException e) {
}
}
}
Этот класс ссылается только на setVoice21
, но мне не нужно удалять ссылку на IllformedLocaleException здесь - я могу оставить его, и приложение работает нормально... Baffled.
Может ли кто-нибудь помочь мне выяснить, почему IllformedLocaleException вызывает этот сбой? Исключения как-то обрабатываются по-разному?
Я благодарю вас заранее.
Примечание. Я не уверен, что это релевантно, но я подклассифицирую TextToSpeech стандартным способом. Я боюсь, что это может свершить вопрос, но на всякий случай...
public class MyTextToSpeech extends TextToSpeech {
public MyTextToSpeech(final Context context, final OnInitListener listener) {
super(context, listener);
}
}
EDIT - обходной путь предоставленный razzledazzle ниже, позволяет приложению запускаться без сбоев, но я по-прежнему остаюсь не- мудрее, почему такой шаг необходим. Мне никогда не приходилось принимать такие меры до того, как вы столкнулись с версиями API.